类加载过程

114 阅读1分钟

1. 加载阶段(Loading):

  • 类加载器: 由类加载器负责将类的字节码文件加载到内存中,生成一个代表该类的 java.lang.Class 对象。
  • 加载顺序: 加载阶段的顺序包括:加载、验证、准备、解析。

2. 验证阶段(Verification):

  • 验证过程: 确保被加载的类是符合 Java 虚拟机规范的,防止恶意代码。
  • 验证类型: 文件格式验证、元数据验证、字节码验证、符号引用验证。

3. 准备阶段(Preparation):

  • 内存分配: 为类变量(static变量)分配内存空间,并设置默认初始值(零值)。
  • 不包括初始化: 不包括执行初始化阶段类构造器 <clinit> 方法。

4. 解析阶段(Resolution):

  • 符号引用替换: 将常量池中的符号引用替换为直接引用。
  • 解析动作: 主要包括类或接口的解析、字段解析、类方法解析、接口方法解析。

5. 初始化阶段(Initialization):

  • 执行 <clinit> 方法: 对类变量进行赋值初始化,执行类构造器 <clinit> 方法,是类加载的最后一步。
  • 线程安全: JVM 会确保 <clinit> 方法的执行在多线程环境中的安全性。

6. 卸载阶段(Unloading):

  • 卸载过程: 类卸载是指卸载已经加载到内存中的类,释放内存空间。
  • 条件: 类被加载后,如果该类的所有实例都被回收,且没有任何地方引用类的 Class 对象,类加载器加载的该类才会被卸载。