JVM 类加载过程
📖 JVM 类加载过程
JVM(Java Virtual Machine,Java虚拟机)的类加载过程是Java程序运行的重要组成部分,它负责将 .class
文件加载到内存中,并生成对应的 Class
对象,供程序使用。
整个类加载过程主要分为以下 五个阶段:
🧩 1. 加载(Loading)
- 作用:将类的字节码从各种来源(如文件系统、网络)加载到内存中,生成
java.lang.Class
对象。 - 来源:
- 本地文件系统(如
.class
文件) - jar包
- 网络(通过自定义类加载器)
- 本地文件系统(如
- 关键点:
- 使用类加载器完成(系统类加载器、自定义类加载器等)
- 字节码文件转为内存中的数据结构(
Class
对象)
🔧 2. 连接(Linking)
连接阶段包含三个子阶段:
2.1 验证(Verification)
- 确保字节码文件符合JVM规范,保证程序运行安全。
- 如校验常量池、字节码格式、类型检查、符号引用等。
2.2 准备(Preparation)
- 为类的 静态变量 分配内存,并设置 默认初始值(不是代码中的初始值)。
- 例如:
static int a = 10;
此时只分配a = 0
。
- 例如:
2.3 解析(Resolution)
- 将常量池中的符号引用(Symbolic Reference)转换为直接引用(Direct Reference)。
- 如方法调用、字段访问、类继承等引用的解析。
🚀 3. 初始化(Initialization)
- 执行类的
<clinit>
方法(静态代码块和静态变量初始化代码)。 - 顺序:
- 父类先初始化
- 子类再初始化
- 只有在类 首次主动使用时 才进行初始化。
💡 4. 使用(Using)
- 类已经被加载到 JVM 中,可以正常使用:实例化对象、调用方法、访问字段等。
🧹 5. 卸载(Unloading)
- 当一个类不再被使用,且对应的
ClassLoader
被回收,则类的Class
对象会被卸载。 - 通常发生在:
- 使用自定义类加载器
- 类加载器及其加载的类都没有引用时
- 注意:JVM 的启动类加载器加载的类通常不会被卸载。
🔄 类加载器体系(ClassLoader)
Java 中有三种主要的类加载器(JDK 8 及之前):
- 启动类加载器(Bootstrap ClassLoader)
- 加载核心类库(
rt.jar
等) - C++实现,非Java对象
- 加载核心类库(
- 扩展类加载器(Extension ClassLoader)
- 加载
ext
目录下的类库(jre/lib/ext
)
- 加载
- 应用类加载器(AppClassLoader)
- 加载classpath下的类
此外还有自定义类加载器,可用于插件系统、热部署等。
📌 类的主动使用 vs 被动使用(初始化的触发)
主动使用(会触发初始化):
- 创建类的实例
- 调用类的静态方法
- 访问类的静态变量(非 final)
- 使用反射调用类的方法或构造器
- 子类初始化时,其父类也会初始化
被动使用(不会触发初始化):
- 访问类的
Class
对象:Class clazz = SomeClass.class;
- 通过数组定义类:
SomeClass[] array = new SomeClass[10];
- 引用常量:
System.out.println(SomeClass.CONSTANT);
(CONSTANT
是static final
并且编译期可确定)
JVM 类加载过程
https://liuyuhe666.github.io/2025/07/06/JVM-类加载过程/