转载

Java类加载机制的

java的类加载机制有七个阶段

当java编译完成,会生成class,需要运行时候就必须会启动JVM虚拟机执行class字节码文件

当JVM虚拟机执行class字节码的时候,有几个阶段 加载 验证 准备 解析 初始化 调用 销毁

加载

就是把数据加载到内存里面,在JVM开辟的内存空间内创建class的对象

验证 jvm加载完class字节码会创建class对象自身的方法并准备调用字节码校验.只要符合jvm字节码规范就能被jvm执行.

jvm规范:jvm会对字节流文件校验.

逻辑校验:jvm还会对class对象内的int等类型参数校验

准备

jvm最核心的工作

内存分配对象 java中变量有类变量和成员变量

类变量以static修饰的变量

而成员变量都在类里面修饰

在准备阶段jvm会对变量进行分配内存

解析

jvm在分配内存后,会对接口字段类方法等调用进行解析.主要任务是能直接在内存调出

初始化

遇到 new、getstatic、putstatic、invokestatic 这四条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这4条指令的最常见的Java代码场景是:使用new关键字实例化对象的时候、读取或设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。

使用 java.lang.reflect 包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。

当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。

当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。

当使用 JDK1.7 动态语言支持时,如果一个 java.lang.invoke.MethodHandle实例最后的解析结果 REF_getstatic,REF_putstatic,REF_invokeStatic 的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化。

使用

当jvm完成初始化 jvm就可以执行程序代码了

注销

当执行完,jvm便会执行回收机制销毁class对象

更多技术咨询了关注:gzitcast

原文  https://segmentfault.com/a/1190000020334326
正文到此结束
Loading...