JVM 类加载机制
2026/8/24大约 3 分钟
JVM 类加载机制
类从 Class 文件加载到内存,经过校验、转换解析和初始化,最终形成可被 JVM 直接使用的 Java 类型。
类加载的定义
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被 Java 虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。
类的生命周期
类从被加载到虚拟机内存开始,到卸载内存为止,生命周期包括七个阶段:
加载 → 验证 → 准备 → 解析 → 初始化 → 使用 → 卸载
└────── 连接(Linking)──────┘其中验证、准备、解析三个部分统称为连接。
类加载的五个过程
1. 加载
- 通过类的全限定名获取定义此类的二进制字节流
- 将字节流代表的静态存储结构转换为方法区的运行时数据结构
- 在 Java 堆中生成代表该类的
java.lang.Class对象,作为方法区数据的访问入口
2. 验证(连接第一阶段)
确保 Class 文件字节流中的信息符合当前虚拟机要求,且不会危害虚拟机自身安全。四个阶段:
| 阶段 | 内容 |
|---|---|
| 文件格式验证 | 字节流是否符合 Class 文件格式规范,能被当前版本虚拟机处理 |
| 元数据验证 | 对字节码描述信息进行语义分析,符合 Java 语言规范 |
| 字节码验证 | 最复杂阶段,数据流和控制流分析,保证方法体运行不会危害虚拟机 |
| 符号引用验证 | 将符号引用转化为直接引用时,对类自身之外的信息进行匹配性校验 |
3. 准备(连接第二阶段)
正式为类变量分配内存并设置初始值(零值),内存都在方法区分配。注意:此时分配的是类变量(static),不是实例变量。
4. 解析(连接第三阶段)
将常量池的符号引用转换为直接引用。解析主要针对四类:类或接口、字段、类方法、接口方法。
5. 初始化
- 前面动作(除加载阶段用户可通过自定义类加载器参与)完全由 JVM 主导
- 到初始化阶段才真正开始执行类中定义的 Java 程序代码
- 初始化阶段是执行类构造器
<clinit>()方法的过程(根据程序员的主观计划初始化类变量)
类加载器
虚拟机把"通过类全限定名获取二进制字节流"这个动作放到虚拟机外部实现,让程序自己决定如何获取类——实现这个动作的代码模块称为类加载器。
双亲委派模型
从 Java 开发人员角度看,绝大部分程序使用以下三种系统提供的类加载器:
| 类加载器 | 说明 |
|---|---|
| 启动类加载器(Bootstrap) | C++ 实现,虚拟机自身一部分,加载核心库 |
| 扩展类加载器(Extension) | Java 实现,加载扩展库 |
| 应用程序类加载器(Application) | Java 实现,加载 classpath 上的类 |
双亲委派原则:类加载请求先委派给父类加载器,只有父类加载器无法完成时才由子类自己加载。这样保证了 Java 核心类库(如 Object)的加载一致性,避免核心类被随意替换。