05JVM_类加载阶段

一、类加载阶段

1.加载

1.1介绍

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

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

复制代码
_java_mirror,java类镜像。例如对String来说,就是String.class,作用把klass暴露给java使用。【桥梁】
_super 父类
_fields 成员变量
_methods 方法
_constants 常量池
_class_loader 类加载器
_vtable 虚方法表
_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<cinit>()V方法

初始化调用<cinit>()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. 完成懒惰初始化单例模式

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

相关推荐
risc1234563 分钟前
Elasticsearch 线程池
java·大数据·elasticsearch
tanyongxi6611 分钟前
C++ Map 和 Set 详解:从原理到实战应用
开发语言·c++
飒飒真编程21 分钟前
C++类模板继承部分知识及测试代码
开发语言·c++·算法
NE_STOP1 小时前
SpringBoot--如何整体读取多个配置属性及其相关操作
java·spring
apihz1 小时前
通用图片搜索-搜狗源免费API接口使用指南
android·java·python·php·音视频
博睿谷IT99_1 小时前
华为数据通信网络基础
开发语言·华为·php·华为认证
蓝桉(努力版)1 小时前
MATLAB可视化5:华夫图(饼图的平替可以表示种类的分布,附有完整代码详细讲解)(求个关注、点赞和收藏)(对配色不满意可以自己调节配色,附调色教程)
开发语言·数学建模·matlab·信息可视化·matlab可视化
风象南1 小时前
基于 SpringBoot 的 REST API 与 RPC 调用的统一封装
java·spring boot·后端
素雪风华1 小时前
Jenkins+Gitee+Docker容器化部署
java·docker·gitee·jenkins·springboot·持续部署
艾莉丝努力练剑2 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(五)
c语言·开发语言·数据结构·学习·算法