JVM类加载机制

JVM类加载机制教程

JVM 类加载机制就是虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型。

JVM类的生命周期

类的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)七个阶段。

其中有的系统把验证、准备、解析这三个阶段统称为连接(Linking)。这七个阶段的运行顺序如下图:

01_类的生命周期.png

在类的生命周期里面,加载、验证、准备、初始化和卸载这 5 个阶段的顺序是确定的,类的加载过程必须按照这种顺序开始(这边是开始,不是进行和完成,会存在一个阶段调用激活另外一个阶段的情况),而解析的过程不一定,它在某些场景下可以在初始化阶段之和再开始。

JVM类初始化场景

  1. 遇到 new、getstatic、putstatic 或者 invokestatic 这 4 条字节码指令时,如果类没有进行过初始化,就需要先触发 初始化。
  2. 使用 java.lang.reflect 包的方法对类进行反射调用的时候,如果类没有进行过初始化,就需要先触发初始化。
  3. 当初始化一个类的时候,发现父类没有被初始化,就要先初始化父类。
  4. 启动虚拟机的时候需要指定一个要执行的主类(包含 main 方法的那个类),虚拟机会先初始化这个类。
  5. 如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果 REF_getStatic、REF_putStatic、REF_invokeStatic 的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,就会触发其初始化。