zoukankan      html  css  js  c++  java
  • 深入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>是线程安全的
     
     

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

  • 相关阅读:
    建造者模式
    模板方法模式
    抽象工厂模式
    工厂方法模式
    Josephus环问题
    单例模式
    求两个数的最大公约数
    Nginx的安装与部署
    左京大夫显辅
    java 调用第三方系统时的连接代码-记录
  • 原文地址:https://www.cnblogs.com/churao/p/8494187.html
Copyright © 2011-2022 走看看