深入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>是线程安全的
 
 
posted @ 2018-03-02 17:08  刍荛采葑菲  阅读(133)  评论(0编辑  收藏  举报