在编译Java文件生成Class文件最终都需要加载到虚拟机中才能使用。虚拟机把Class文件加载到内存,并对数据进行校验、转换解析、初始化,最终形成可以被虚拟机直接使用的Java类型。
类从被加载到卸载,生命周期如下:
加载 —> 验证 —> 准备 —> 解析 —> 初始化 —> 使用 —> 卸载
其中验证、准备、解析三个节点称为连接。
- 加载:找到Class加载到内存中,生成一个代表改类的Class对象(不同的虚拟机实现可不一样)。
- 验证:校验Class中字节流符合当前虚拟机要求,主要包括文件格式验证、元数据验证、字节码验证、符号引用验证(NoSuchFieldError,NoSuchMethodError)。
- 准备:为类变量分配内存初始化变量的初始值(只是赋值初始值,并不是赋值准确的值,如static a=1,此处static=0,之后初始化在设置static=1)此处不包含final修饰的static,因为final修饰的static在编译时就会分配。
- 解析:主要将常量池中符号引用(用于描述所引用的目标,目标不一定已经加载到内存中)替换为直接引用的过程。虚拟机要求在执行anewarray、checkcast、getfield、getstatic、instanceof、invokeinterface、invokespecial、invokestatic、invokevirtual、multianewarray、new、putfield、putstatic这13操作符之前对所使用的符号引用进行解析即可。
- 初始化:类加载最后阶段,如果类具有父类,向上初始化,执行静态代码块已经初始化静态属性。
上述中加载、验证、准备、初始化、卸载是确定的顺序,解析并不一定在上述所在的顺序,在有些情况下,解析可以在初始化之后,这是为了支持Java运行时绑定。