虚拟机的类加载机制:java源代码被编译成class字节码,JVM把描述类数据的字节码.class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。
类从被加载到虚拟机内存中开始,到卸载出内存为止,生命周期包括:
1、加载
1)通过一个类的全限定名来获取定义此类的二进制字节流
2)将这个字节流所代表的静态存储结构转化为方法区域的运行数据结构
3)在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区域数据的访问入口
2、验证
1)文件格式验证:验证字节流文件是否符合Class文件格式的规范,并且能被当前虚拟机正确的处理
2)元数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合java语言的规范
3)字节码验证:进行数据流和控制流的分析,保证被校验类的方法在运行时不会危害虚拟机
4)符号引用验证:发生在虚拟机将符号引用转化为直接引用的时候(解析动作在解析阶段发生)
3、准备
为变量分配内存并设置类变量(仅为类变量(Static)不包括实例变量)的初始化。 (final修饰的类变量将会赋值成真是的值,非final的变量,JVM会将其设置成“零值”)
4、解析
是虚拟机常量池内的符号引用替换为直接引用的过程。(类、接口;字段;类方法;接口方法)
5、初始化
执行类构造器。
6、使用
新线程——程序计数器——JVM栈执行(对象引用)——堆内存(直接引用)——方法区
7、卸载
GC垃圾回收。
(加载、验证、准备、初始化、卸载这五个阶段固定,顺序不可变。为了运行时动态绑定特性(如重写)可将解析阶段放至初始化之后)