JVM类加载

类的生命周期

  • 加载
  • 验证(连接)
  • 准备(连接)
  • 解析(连接)
  • 初始化
  • 使用
  • 卸载

类加载过程

如何加载.class文件

主要分为三步:加载->连接->初始化

加载

类的加载是指将类的字节码从某个介质加载到JVM内存中。此时JVM需要根据类的全限定名(包括包名和类名)来查找文件。

  1. 查找类:JVM会通过类加载器ClassLoader根据类名找到类的.class文件

    • 例如:通过系统类路径classpath、JAR包、或者其他配置路径来寻找文件
    • 在应用服务器、动态代理场景下,类可能通过网络加载。
  2. 读取字节码:一旦找到类文件,JVM会读取.class文件的内容,并将其转换为字节流。类加载器负责将这些字节流传递给JVM进一步处理。

  3. 加载进入内存:在内存中生成一个代表该类的class对象,作为方法区这些数据的访问入口。

类加载器有很多种,当我们想要加载一个类的时候,具体哪个类加载器加载由双亲委派模型决定。

验证

验证是链接阶段的第一步,这一阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当做代码运行后不避讳危害虚拟机自身的安全。

验证阶段这一步在整个类加载过程中耗费的资源相对较多,但是可以防止恶意代码的执行。

我们可以通过添加虚拟机参数-Xverify:none来关闭类验证措施

准备

解析

初始化

类卸载

卸载类即该类的Class对象被GC,卸载类需要满足3个要求。

  1. 该类的所有实例对象都已经被GC
  2. 该类没有在其他任何地方被引用
  3. 该类的类加载器的实力已经被GC

所以JVM生命周期内,由JVM自带的类加载器加载的类不会被卸载,但由自定义的类加载器加载的类是可能被卸载的。

JDK 自带的 BootstrapClassLoader, ExtClassLoader, AppClassLoader 负责加载 JDK 提供的类,所以它们(类加载器的实例)肯定不会被回收。而我们自定义的类加载器的实例是可以被回收的,所以使用我们自定义加载器加载的类是可以被卸载掉的。


JVM类加载
https://yicizhang00.github.io/posts/编程语言/Java/Java基础/类加载过程/
作者
Yici Zhang
发布于
2025年8月12日
许可协议