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> 方法(静态代码块和静态变量初始化代码)。
  • 顺序:
    1. 父类先初始化
    2. 子类再初始化
  • 只有在类 首次主动使用时 才进行初始化。

💡 4. 使用(Using)

  • 类已经被加载到 JVM 中,可以正常使用:实例化对象、调用方法、访问字段等。

🧹 5. 卸载(Unloading)

  • 当一个类不再被使用,且对应的 ClassLoader 被回收,则类的 Class 对象会被卸载。
  • 通常发生在:
    • 使用自定义类加载器
    • 类加载器及其加载的类都没有引用时
  • 注意:JVM 的启动类加载器加载的类通常不会被卸载

🔄 类加载器体系(ClassLoader)

Java 中有三种主要的类加载器(JDK 8 及之前):

  1. 启动类加载器(Bootstrap ClassLoader)
    • 加载核心类库(rt.jar 等)
    • C++实现,非Java对象
  2. 扩展类加载器(Extension ClassLoader)
    • 加载 ext 目录下的类库(jre/lib/ext
  3. 应用类加载器(AppClassLoader)
    • 加载classpath下的类

此外还有自定义类加载器,可用于插件系统、热部署等。

📌 类的主动使用 vs 被动使用(初始化的触发)

主动使用(会触发初始化):

  • 创建类的实例
  • 调用类的静态方法
  • 访问类的静态变量(非 final)
  • 使用反射调用类的方法或构造器
  • 子类初始化时,其父类也会初始化

被动使用(不会触发初始化):

  • 访问类的 Class 对象:Class clazz = SomeClass.class;
  • 通过数组定义类:SomeClass[] array = new SomeClass[10];
  • 引用常量:System.out.println(SomeClass.CONSTANT);CONSTANTstatic final 并且编译期可确定)

JVM 类加载过程
https://liuyuhe666.github.io/2025/07/06/JVM-类加载过程/
作者
Liu Yuhe
发布于
2025年7月6日
许可协议