虚拟机类加载机制

提问环节

  1. 为什么需要加载?
  2. 加载的时机是什么时候?
  3. 加载的过程有哪些步骤?完成了哪些工作?

阅读《深入理解Java虚拟机》后的分析

Q:为什么需要加载?
A:Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能允许和使用。

Q:加载的时机是什么时候?
A:在程序运行期间进行。

Q:加载的过程有哪些步骤?
A:类从被加载到虚拟机内存中开始,到写在出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。


类的生命周期.png

Q:那在上述过程中的第一个阶段“加载”什么时候被触发呢?
A:Java虚拟机规范中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。但是对于初始化阶段,虚拟机规范则是严格规定了有且只有5种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在此之前开始):

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

你可能感兴趣的:(虚拟机类加载机制)