返回
JVM类加载机制的深入剖析:从JDK源码的角度看JVM类加载运行全过程
后端
2023-09-23 04:55:06
类加载的各个阶段
Java类在被执行之前,需要先经过加载、验证、准备、解析和初始化这几个阶段,如图所示:
+-------------------------+
| 类加载的各个阶段 |
+-------------------------+
| 加载 |
+-------------------------+
| 验证 |
+-------------------------+
| 准备 |
+-------------------------+
| 解析 |
+-------------------------+
| 初始化 |
+-------------------------+
加载:
加载阶段,JVM将类文件从硬盘读取到内存中,并创建Class对象。Class对象包含了类文件的所有信息,包括类名、方法、字段、常量池等。
验证:
验证阶段,JVM对加载的类文件进行验证,确保它符合Java语言规范。验证包括:
- 字节码验证: 检查类文件是否符合Java虚拟机规范。
- 类型验证: 检查类中的字段、方法、参数等是否符合Java语言规范。
准备:
准备阶段,JVM为类的静态变量分配内存,并设置默认值。
解析:
解析阶段,JVM将类中的符号引用转换为直接引用。符号引用是指类名、方法名、字段名等,而直接引用是指类对象、方法对象、字段对象等。
初始化:
初始化阶段,JVM执行类的静态代码块和实例代码块,对类的静态变量和实例变量进行赋值。
类加载器的作用
类加载器负责将类文件加载到内存中。Java中提供了多种类加载器,包括:
- 启动类加载器: 负责加载Java核心库中的类。
- 扩展类加载器: 负责加载Java扩展库中的类。
- 系统类加载器: 负责加载用户自定义的类。
- 自定义类加载器: 可以由开发人员自定义,用于加载特定的类。
双亲委派模型
双亲委派模型是一种类加载机制,它规定:当一个类加载器需要加载一个类时,它首先会委托给它的父类加载器去加载。如果父类加载器能够加载该类,那么它就不会自己加载,而直接使用父类加载器加载的类。如果父类加载器无法加载该类,那么它才会自己尝试加载该类。
双亲委派模型的好处是,它可以防止重复加载类,从而提高性能。此外,它还可以保证类的安全性和稳定性。
总结
本文从JDK源码的角度,深入剖析了JVM类加载机制的运行全过程。通过对类加载的各个阶段、类加载器的作用和双亲委派模型的理解,我们可以更加深入地了解JVM的运行机制,以便在实际开发中能够更有效地利用JVM的特性。