美文网首页
JVM类加载与类的生命周期

JVM类加载与类的生命周期

作者: barry_di | 来源:发表于2018-01-15 16:44 被阅读0次

    一.JAVA虚拟机加载Class的过程

    1.类加载器

    JAVA中类由类加载器(ClassLoader)和它的子类来实现装载,而类加载器(ClassLoader)是一个重要的运行系统组件,它负责在运行时查找和装入类文件中的类。类加载器与JAVA虚拟机之间的传递是通过字节码传递。

    2.类的生命周期

    Java类从加载到虚拟机内存中到从虚拟机中卸载,它的整个生命周期包括:

    (1)加载

    将编译后的class文件加载到内存中,然后创建与加载class对应的类对象。此时Class对象还是不完整,所以此时的类还不可用。

    (2)连接

    这一阶段是主要对Class对象进行验证 , 准备 , 解析。准备主要为静态变量分配内存并设置默认的初始值,而解析主要是将符号引用替换为直接引用。

    • 验证阶段:主要是检测当前的代码是否可以被jvm正常执行。包括以下验证:

      • 1.类文件的结构检查:检测CLASS文件是否符合了Class的固定结构。
      • 2.语义检查:检测Class的语法是否存在错误
      • 3.字节码验证:验证内容主要包括以下:
        • (1) 变量要在使用之前进行初始化
        • (2)方法调用与对象引用类型间要匹配
        • (3)访问私有数据和方法的规则没有被违反
        • (4)对本地变量的访问都落在运行时堆栈内
        • (5)运行时堆栈没有溢出
        • (6)校验器总是在防范被故意篡改的类文件, 而不仅仅只是检查编译器产生的类文件
    • 准备阶段:主要进行内存的分配,并且对静态变量赋默认值。如下代码,准备阶段会对intVariable分配4个字节的存储空间并且赋默认值0.对longVariable分配8个字节的存储空间并且赋默认值0.

    public class PreparatoryPhase {
         private static int intVariable = 1;
         private static long longVariable; 
    }
    
    (3)初始化

    初始化阶段主要对类进行初始化包括:
    1) 加载类的实例
    2) 加载类的静态方法
    3) 加载类的静态变量
    4)实例化一个对象
    2)父类初始化,如果类存在直接的父类并且这个类还没有被初始化,先初始化父类;
    3)如果类中存在初始化语句,就依次执行这些初始化语句。

    (4)卸载

    当类的Class对象不再被引用时,Class对象就会结束生命周期,Class类在方法区内的数据也会被卸载,从而结束Class类的生命周期。

    我们开分清楚:Class\Class对象\Class的实例
    Class代表的是我们编译后的Class文件,JVM加载的Class文件。而Class对象则是通过JVM加载过程后,

    Reference:
    http://blog.csdn.net/xupeng874395012/article/details/76424425
    http://blog.csdn.net/PacosonSWJTU/article/details/50707346

    相关文章

      网友评论

          本文标题:JVM类加载与类的生命周期

          本文链接:https://www.haomeiwen.com/subject/njqgnxtx.html