类加载过程
1. 加载阶段(Loading):
- 类加载器: 由类加载器负责将类的字节码文件加载到内存中,生成一个代表该类的
java.lang.Class 对象。
- 加载顺序: 加载阶段的顺序包括:加载、验证、准备、解析。
2. 验证阶段(Verification):
- 验证过程: 确保被加载的类是符合 Java 虚拟机规范的,防止恶意代码。
- 验证类型: 文件格式验证、元数据验证、字节码验证、符号引用验证。
3. 准备阶段(Preparation):
- 内存分配: 为类变量(static变量)分配内存空间,并设置默认初始值(零值)。
- 不包括初始化: 不包括执行初始化阶段类构造器
<clinit> 方法。
4. 解析阶段(Resolution):
- 符号引用替换: 将常量池中的符号引用替换为直接引用。
- 解析动作: 主要包括类或接口的解析、字段解析、类方法解析、接口方法解析。
5. 初始化阶段(Initialization):
- 执行
<clinit> 方法: 对类变量进行赋值初始化,执行类构造器 <clinit> 方法,是类加载的最后一步。
- 线程安全: JVM 会确保
<clinit> 方法的执行在多线程环境中的安全性。
6. 卸载阶段(Unloading):
- 卸载过程: 类卸载是指卸载已经加载到内存中的类,释放内存空间。
- 条件: 类被加载后,如果该类的所有实例都被回收,且没有任何地方引用类的 Class 对象,类加载器加载的该类才会被卸载。