Java 虚拟机类的装载过程包含三个阶段:
(1) 加载
(2) 链接
- 验证
- 准备
- 解析
(3)初始化
实际运行中,三个阶段并非一定按顺序执行,但总体来说完整的加载过程总是包含这三个阶段。
1.1 加载
1)取得类的二进制字节流,通过类的全限定名称(包名+类名)
由类加载器加载至运行时数据区
2)把二进制字节流中静态存储结构转化为方法区数据结构
3)在内存中生成代表这个类的java.lang.Class对象,并存放在堆中
1.2 链接
链接阶段又包含验证、准备、解析3个步骤。
1)验证,验证类的格式是否正确
- 文件格式的验证,如文件类型、版本号等类信息
- 元数据验证,如继承关系
- 字节码验证
- 符号引用验证
2)准备
为类的静态变量分配内存(方法区),并将其初始化成默认值,如
- int -> 0
- long -> 0L
- boolean -> false
- 常量直接赋予真实值
public static final int DEFAULT = 2;
2)解析
常量池中的符号引用替换为直接引用
1.3 初始化
- 如果这个类还没有被加载和链接,那就先加载和链接
- 如果类存在直接的父类,先初始化直接父类
- 如果类中存在初始化语句,那就依次执行初始化语句
此时,类的构造器: 会通过编译器自动收集static{ } 语句,static 变量并进行初始化。
1.4 类的初始化时机
当主动使用类时,会触发类的初始化阶段,主动使用的情况如:
- new,创建类的实例对象
- 反射
- 调用类的静态方法
- 初始化类的子类,因为子类的初始化需要先初始化其父类
- 访问类中的静态变量或给静态变量赋值
- JVM启动时的启动类
附:
JVM 生命周期结束时机:
- 调用 System.exit();
- 程序正常运行结束;
- JVM异常终止;
- 手动kill JVM进程
参考资料:
深入理解Java虚拟机 JVM高级特性与最佳实践