• 深入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>是线程安全的
     
     

    文章源自微信公众号【刍荛采葑菲】,转载请注明。

  • 相关阅读:
    Visual C++ 2010 SP1 x86&x64
    MVC拦截
    自定义HTTP消息拦截
    转mysql半主从同步
    mysql主从搭建之诡异事件
    snapshot相关
    分布式系统唯一ID生成方案汇总
    mysql监控利器mysqlmtop部署安装
    mysql日常运维
    MySQL索引背后的数据结构及算法原理
  • 原文地址:https://www.cnblogs.com/churao/p/8494187.html
Copyright © 2020-2023  润新知