首页 > 代码库 > 第七章——虚拟机类加载机制——学习总结

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

类的生命周期

技术分享

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 = http://www.mamicode.com/123;在此阶段,它的零值是 0;

    public static int value = http://www.mamicode.com/123;在此阶段,它的零值是 123;

    零值对应表:

      技术分享

7.4解析

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

  技术分享

  技术分享

7.5初始化

  技术分享

  技术分享

  技术分享

 

类加载器

  1、什么是类加载器。

    技术分享

  技术分享

    技术分享

    技术分享技术分享

    

 

 

 

 

 

 

 

 

 

 

    

 

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