深入JVM《六》 类装载器

Posted 刍荛采葑菲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入JVM《六》 类装载器相关的知识,希望对你有一定的参考价值。

一、加载

    装载类的第一阶段,
    取得类的二进制流,并将它转换为方法区数据结构。
    在Java堆中生成对应的java.lang.Class对象

    

二、链接

    1、验证
        目的:保证Class流的格式是正确的。
        a) 文件格式的验证
             是否以0xCAFEBABE开头
            版本号是否合理
        b) 元数据验证
            是否有父类
            继承了final类?
            非抽象类实现了所有的抽象方法
        c) 字节码验证 (很复杂)
            运行检查
             栈数据类型和操作码数据参数吻合
            跳转指令指定到合理的位置
        d) 符号引用验证
             常量池中描述类是否存在
            访问的方法或字段是否存在且有足够的权限
    2、准备
        分配内存,并为类设置初始值 (方法区中)
            public static int v=1;
            在准备阶段中,v会被设置为0 ;
            在初始化的<clinit>中才会被设置为1;
             对于static final类型,在准备阶段就会被赋上正确的值;
             public static final  int v=1;
    3、解析
        符号引用替换为直接引用 。
            符号引用:字符串 引用对象不一定被加载 。
            直接引用:指针或者地址偏移量 引用对象一定在内存 。

三、初始化

    执行类构造器<clinit>
        static变量 赋值语句
        static{}语句
    子类的<clinit>调用前保证父类的<clinit>被调用
     <clinit>是线程安全的




以上是关于深入JVM《六》 类装载器的主要内容,如果未能解决你的问题,请参考以下文章

深入理解JVM——类加载器原理

JVM的类装载子系统

深入浅出-JVM(75):class 装载

类装载器学习

JVM 专题三:类加载子系统类装载器子系统

ClassLoader原理