• 05JVM_类加载阶段


    一、类加载阶段

    1.加载

    1.1介绍

    ①Java源代码经编译生成字节码文件,通过类加载阶段字节码载入方法区

    ②类加载阶段内部是C++的instanceKlass描述java类,重要的域field有:

    1. _java_mirror,java类镜像。例如对String来说,就是String.class,作用把klass暴露给java使用。【桥梁】
    2. _super 父类
    3. _fields 成员变量
    4. _methods 方法
    5. _constants 常量池
    6. _class_loader 类加载器
    7. _vtable 虚方法表
    8. _itable 接口方法表

    ③类有父类,先加载父类。

    ④加载和链接可能交替运行

    1.2注意

    ①加载的类在JVM创建相应的类结构instanceKlass的元数据存储在方法区(jdk1.8在元空间内),但_java_mirror的java类镜像存储在堆中。

    ②将.class文件加载到元空间后,会在堆中创建一个java.lang.Class对象。该Class对象在加载类的过程创建的,每个类都有一个Class类型的对象。

    ③外部通过访问Person类的Class对象获取Person的类数据结构。通过class类提供的接口,可以获得目标类所关联的.class文件的具体数据结构:方法、字段信息。

    【图解】

    加载到方法区的元空间类的字节码加载到元空间构成instanceKlass数据结构,并在内存生成_java_mirror的java类镜像Person.class类对象

    ②当new创建Person的实例对象。每个实例的对象头存储对应着class地址。通过这个地class地址就能找到Person.class类对象,然后间接的在元空间找到instanceKlass,来获取Person类的方法,字段信息。

    2.链接

    链接的三阶段

    验证,准备,解析。

    2.1链接-验证

    1.验证的目的

    验证是否符合JVM规范,进行安全性检查。

    2.1链接-准备

    ①为static静态变量分配空间,设置默认值。

    ②jdk1.8后静态变量存放在空间类对象后面

    ③早期jdk6之前的静态变量存放在instanceKlass后面,存放方法区。

    ④static变量分配空间在准备阶段完成,赋值在初始化阶段完成

    ⑤static final基本类型变量。分配空间,赋值在准备阶段。如果是引用类型,赋值在初始化。

    2.1链接-解析

    解析的含义:

    将常量池的符号引用解析为直接引用。得到类,字段,方法在内存中的地址。

    3.初始化

    给类中声明的静态变量初始化赋值

    3.1()V方法

    初始化调用()V,虚拟机保证这个类的构造方法的线程安全。

    3.2发生的时机

    类初始化是懒惰的

    类的初始化

    main方法所在的类,首先初始化。作为程序的入口

    ②首次访问这个类的静态变量或静态方法

    子类初始化,如果父类没初始化,会引发父类初始化

    ④子类访问父类的静态变量,只有父类初始化

    ⑤反射,Class.forName

    ⑥new会导致初始化

    类不能初始化

    ①访问类的static final 静态常量(基本类型和字符串)不会类的初始化。(准备阶段完成了)

    ②类对象.class不会触发初始化

    ③创建类的数组不会触发初始化

    ④类加载器的loadClass方法,只会加载,不会解析和初始化。

    ⑤Class.forName的参数2为false

    练习

    1.从字节码分析,使用a,b,c这三个常量是否会导致E初始化

    E.a ,E.b不会,这是static final基本类型变量。赋值在准备阶段

    E.c 会,static final引用类型变量,赋值要初始化

    2.完成懒惰初始化单例模式

     懒惰实例化,初始化线程安全有保障。

  • 相关阅读:
    创新案例分享 | 医院DRG系统建设项目,助力精细化分析医疗数据
    【FPGA教程案例30】基于FPGA的DDS直接数字频率合成器之三——借助MATLAB进行频率精度分析
    研究生写脚本抢HPV九价疫苗:被采取强制措施,后果严重
    Unity 手动编译 Reload脚本 减少等待时间
    QT+OSG/osgEarth编译之十七:proj+Qt编译(一套代码、一套框架,跨平台编译,版本:通用坐标转换库proj-9.1.0)
    【分享】“抖店“在集简云平台集成应用的常见问题与解决方案
    逆向分析:基于 JS 字节码的保护技术
    公众号网课答案查题方法搭建
    微信小程序------框架
    TS(TypeScript)和axios实现VUE请求重试
  • 原文地址:https://blog.csdn.net/jbkjhji/article/details/132845260