当一个 Java 类被加载进虚拟机,其生命周期正式开启,直至从内存卸载才告结束。整个过程可划分为加载、验证、准备、解析、初始化、使用和卸载七个阶段,其中前三个阶段常被统称为连接。
加载
这一阶段主要涉及三个关键动作:首先通过全限定名获取类的二进制字节流;接着将该字节流代表的静态存储结构转为方法区的运行时数据结构;最后在内存中生成代表此类的 java.lang.Class 对象,作为访问入口。
验证
紧接着是验证环节,核心在于确保字节流的安全与合规。主要完成四个方面的校验工作:
- 文件格式验证:检查字节流是否符合规范,例如魔数是否为 0xCAFEBABE。
- 元数据验证:进行语义分析,确保继承关系和方法实现符合语言规范。
- 字节码验证:通过数据流和控制流分析程序逻辑是否合法。
- 符号引用验证:确保常量池中的引用能被正确匹配。
准备
随后进入准备阶段,此时会为静态变量分配内存空间,并赋予系统定义的零值(如 int 为 0),而非代码中指定的初始值。
解析
到了解析阶段,虚拟机开始把常量池里的符号引用替换成直接引用。符号引用是以一组符号描述目标,而直接引用则是直接指向目标的指针或句柄,这能让后续访问更高效。
初始化
初始化才是真正的代码执行时刻。按照程序员编写的代码,给类变量赋最终值,并执行静态语句块等资源初始化操作。
使用
使用阶段涵盖了类在运行时的实际表现,包括对象的创建、方法调用以及后续的回收管理。
卸载
最后是卸载,当类不再被任何引用指向且满足垃圾回收条件时,完成从内存中移除的过程。


