Java类加载全流程解析 2
Java类加载全流程解析 2
回答
- Java中类的加载阶段分为加载(Loading)、链接(Linking)和初始化(Initialization)。
1、加载阶段
-
加载目的:是将类的 .class文件 加载到 JVM 中
-
加载过程:会创建一个
java.lang.Class类的实例来表示这个类。这个Class对象作为程序中每个类的数据访问入口。
2、链接阶段
- 验证:校验类的正确性(文件格式,元数据,字节码,二进制兼容性),保证类的结构符合JVM规范。
- 准备:为类变量分配内存并设置类变量的默认初始值,这些变量使用的内存都在方法区中分配。(这里初始化的是类变量,即static字段,实例变量会在对象实例化时随对象一起分配在Java堆中。)
- 解析:把类的符号引用转为直接引用 (类或接口、字段、类方法、接口方法、方法类型、方法句柄和访问控制修饰符7类符号引用 )
3、初始化阶段
-
初始化的本质:基于懒加载思想,仅在类首次主动使用时初始化。
-
初始化的触发场景:
-
字节码指令触发:
new(创建类实例)、getstatic(读取未被final修饰的静态字段)、putstatic(设置静态字段值)、invokestatic(调用静态方法) -
反射触发:
通过
java.lang.reflect包反射调用类,若类未初始化则触发。 -
父类初始化优先:
初始化子类时,若父类未初始化,先触发父类初始化。
-
虚拟机启动主类:
程序启动时,含
main方法的主类会被初始化。 -
JDK 1.7 动态语言场景:
当
MethodHandle实例最终解析为REF_getStatic、REF_putStatic、REF_invokeStatic类型的方法句柄,且句柄未初始化时,触发类初始化。
-