返回

JVM类加载机制的深入剖析:从JDK源码的角度看JVM类加载运行全过程

后端

类加载的各个阶段

Java类在被执行之前,需要先经过加载、验证、准备、解析和初始化这几个阶段,如图所示:

+-------------------------+
| 类加载的各个阶段          |
+-------------------------+
| 加载                  |
+-------------------------+
| 验证                  |
+-------------------------+
| 准备                  |
+-------------------------+
| 解析                  |
+-------------------------+
| 初始化                  |
+-------------------------+

加载:

加载阶段,JVM将类文件从硬盘读取到内存中,并创建Class对象。Class对象包含了类文件的所有信息,包括类名、方法、字段、常量池等。

验证:

验证阶段,JVM对加载的类文件进行验证,确保它符合Java语言规范。验证包括:

  • 字节码验证: 检查类文件是否符合Java虚拟机规范。
  • 类型验证: 检查类中的字段、方法、参数等是否符合Java语言规范。

准备:

准备阶段,JVM为类的静态变量分配内存,并设置默认值。

解析:

解析阶段,JVM将类中的符号引用转换为直接引用。符号引用是指类名、方法名、字段名等,而直接引用是指类对象、方法对象、字段对象等。

初始化:

初始化阶段,JVM执行类的静态代码块和实例代码块,对类的静态变量和实例变量进行赋值。

类加载器的作用

类加载器负责将类文件加载到内存中。Java中提供了多种类加载器,包括:

  • 启动类加载器: 负责加载Java核心库中的类。
  • 扩展类加载器: 负责加载Java扩展库中的类。
  • 系统类加载器: 负责加载用户自定义的类。
  • 自定义类加载器: 可以由开发人员自定义,用于加载特定的类。

双亲委派模型

双亲委派模型是一种类加载机制,它规定:当一个类加载器需要加载一个类时,它首先会委托给它的父类加载器去加载。如果父类加载器能够加载该类,那么它就不会自己加载,而直接使用父类加载器加载的类。如果父类加载器无法加载该类,那么它才会自己尝试加载该类。

双亲委派模型的好处是,它可以防止重复加载类,从而提高性能。此外,它还可以保证类的安全性和稳定性。

总结

本文从JDK源码的角度,深入剖析了JVM类加载机制的运行全过程。通过对类加载的各个阶段、类加载器的作用和双亲委派模型的理解,我们可以更加深入地了解JVM的运行机制,以便在实际开发中能够更有效地利用JVM的特性。