
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~
深入理解 JVM 类加载机制:从加载到初始化的全过程
简介:
Java 虚拟机(JVM)的类加载机制是 Java 程序运行的基础,它确保了字节码文件在运行时被正确加载、验证和执行。JVM 类加载机制分为五个关键阶段——加载、验证、准备、解析和初始化。
类加载机制概述:
JVM 的类加载机制是一个分阶段的过程,每个阶段都有明确的任务和目标。通过这种逐步加载的方式,JVM 保证了类的安全性和一致性。以下是类加载机制的五个主要阶段:
- 加载 (Loading)
- 验证 (Verification)
- 准备 (Preparation)
- 解析 (Resolution)
- 初始化 (Initialization)
1. 加载 (Loading)
定义与任务
加载是类加载过程的第一个阶段。在这个阶段中,JVM 会完成以下几项任务:
- 查找并加载字节码文件:JVM 会根据类的全限定名找到对应的
.class文件,或者从其他来源(如网络、数据库等)获取字节码。 - 生成
java.lang.Class对象:在方法区(或元空间,取决于 JVM 实现)中创建一个代表该类的java.lang.Class对象,作为该类在 JVM 内部的数据入口。 - 存储类信息:将类的二进制数据(包括类的版本、字段、方法、接口等信息)加载到内存中,并存放在方法区。
2. 验证 (Verification)
定义与任务
验证阶段的主要目的是确保字节码文件的完整性和安全性。具体来说,验证器会检查以下内容:
- 文件格式验证:确认字节码文件符合 Java 类文件格式规范。
- 元数据验证:检查类的元数据是否合法,例如是否有重复的字段或方法签名。
- 字节码验证:确保字节码不会破坏 JVM 的安全模型,例如非法的操作码或不合理的跳转指令。
- 符号引用验证:验证所有符号引用指向的类和成员是否存在且可访问。
目的
验证阶段的存在是为了防止恶意代码或损坏的字节码对 JVM 造成危害,从而保障 JVM 的安全性和稳定性。
3. 准备 (Preparation)
定义与任务
准备阶段的主要任务是在方法区中为类变量分配内存空间,并设置默认初始值。需要注意的是:
- 基本类型:为
byte、short、int分配0,long分配0L,float分配0.0f,double分配0.0d,char分配\u0000。 - 引用类型:为对象引用类型的类变量分配
null。 - 常量赋值:如果类变量声明为
public static final,则直接赋给指定的常量值(例如public static final int PORT = 8080会被直接赋值为8080)。
注意
准备阶段并不会为实例变量分配内存,这些将在对象实例化时进行。
4. 解析 (Resolution)
定义与任务
解析阶段的主要任务是将常量池中的符号引用转换为直接引用。符号引用通常包含以下几种类型:
- CONSTANT_Class_info:表示类或接口的符号引用。
- CONSTANT_Field_info:表示字段的符号引用。
- CONSTANT_Method_info:表示方法的符号引用。
直接引用是指可以直接定位到目标实体的指针、相对偏移量或句柄。解析完成后,JVM 可以直接使用这些直接引用来访问类、字段和方法。
5. 初始化 (Initialization)
定义与任务
初始化阶段是类加载过程的最后一个阶段,也是真正开始执行类中代码的阶段。在这个阶段中,JVM 会执行以下操作:
- 静态变量赋值:为类中的静态变量赋予显式赋值。
- 静态代码块执行:执行静态代码块中的代码。
- 父类初始化:先初始化父类,再初始化子类。
静态变量与静态代码块的执行顺序按照代码编写时的先后顺序执行。
初始化顺序
- 类的初始化顺序:静态变量显示赋值 -> 静态代码块(按顺序执行)
- 实例的初始化顺序:非静态变量显示赋值 -> 非静态代码块(按顺序执行) -> 构造器方法
总结:
JVM 类加载机制通过五个阶段——加载、验证、准备、解析和初始化,确保了 Java 应用程序能够在不同平台上稳定、安全地运行。每个阶段都有其特定的任务和目标,共同构成了 Java 的“一次编写,到处运行”的强大特性。


1418

被折叠的 条评论
为什么被折叠?



