码迷,mamicode.com
首页 > 其他好文 > 详细

深入JVM《六》 类装载器

时间:2018-03-02 18:46:06      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:常量池   style   指定   lan   链接   方法   偏移量   结构   跳转指令   

一、加载

    装载类的第一阶段,
    取得类的二进制流,并将它转换为方法区数据结构。
    在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《六》 类装载器

标签:常量池   style   指定   lan   链接   方法   偏移量   结构   跳转指令   

原文地址:https://www.cnblogs.com/churao/p/8494187.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!