第七章——虚拟机类加载机制——学习总结

类的生命周期

7.2、开始类加载、类初始化的时机。

  1)类加载过程的第一个阶段:加载。虚拟机规范中没有进行强制约束,交由具体的虚拟机实现来自由把握。

  2)初始化 阶段,虚拟机规范中严格规定了有且只有4种情况必须立即对类进行“初始化”(加载,验证,准备自然在初始化之前开始)。

    a)遇到new、getstatic、putstatic、invokestatic四条字节码指令时,若类没被初始化,则要立即初始化。

    b)使用java.lang.reflect包的方法对类进行反射调用时,若类没被初始化,则要立即初始化。

    c)当初始化一个类时,若它的父类还没被初始化,则需先初始化父类。

    d)当虚拟机启动时,用户需要指定一个要执行的主类(包括main()方法的那个类),虚拟机会先初始化这个主类。

  以上四种情况的行为称作对一个类的主动引用。除此之外所有引用类的方式,都不会触发类的初始化,称为被动引用。

  以下贴3个被动引用的场景例子:

  

  

  

  扩展:

  

7.3类加载过程,具体动作。

  1.加载:

    

    

    虚拟机规范的这三点比较笼统,具体实现上灵活度高。

  2.验证:  

    这一阶段的目的:为了确保class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全。

    

    1.文件格式验证:

    

    2.元数据验证:主要检查语言规范。

    

    3.字节码验证

    

    4.符号引用验证

    

    总结:

    

7.3准备

   准备阶段是正式为类变量(被static修饰的变量)分配内存并设置初始值(数据类型的“零值”)的阶段,这些内存都将在方法区中分配。

  举例:

    public static int value = 123;在此阶段,它的零值是   0;

    public static int value = 123;在此阶段,它的零值是   123;

    零值对应表:

      

7.4解析

  是虚拟机将常量池中的符号引用替换为直接应用的过程。

  

  

7.5初始化

  

  

  

类加载器

  1、什么是类加载器。

    

  

    

    

    

    

原文地址:https://www.cnblogs.com/wzk1992/p/6956457.html