深入理解 JVM 类加载机制:从加载到初始化的全过程

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述


简介:

Java 虚拟机(JVM)的类加载机制是 Java 程序运行的基础,它确保了字节码文件在运行时被正确加载、验证和执行。JVM 类加载机制分为五个关键阶段——加载、验证、准备、解析和初始化。

类加载机制概述:

JVM 的类加载机制是一个分阶段的过程,每个阶段都有明确的任务和目标。通过这种逐步加载的方式,JVM 保证了类的安全性和一致性。以下是类加载机制的五个主要阶段:

  1. 加载 (Loading)
  2. 验证 (Verification)
  3. 准备 (Preparation)
  4. 解析 (Resolution)
  5. 初始化 (Initialization)



1. 加载 (Loading)

定义与任务

加载是类加载过程的第一个阶段。在这个阶段中,JVM 会完成以下几项任务:

  • 查找并加载字节码文件:JVM 会根据类的全限定名找到对应的 .class 文件,或者从其他来源(如网络、数据库等)获取字节码。
  • 生成 java.lang.Class 对象:在方法区(或元空间,取决于 JVM 实现)中创建一个代表该类的 java.lang.Class 对象,作为该类在 JVM 内部的数据入口。
  • 存储类信息:将类的二进制数据(包括类的版本、字段、方法、接口等信息)加载到内存中,并存放在方法区。



2. 验证 (Verification)

定义与任务

验证阶段的主要目的是确保字节码文件的完整性和安全性。具体来说,验证器会检查以下内容:

  • 文件格式验证:确认字节码文件符合 Java 类文件格式规范。
  • 元数据验证:检查类的元数据是否合法,例如是否有重复的字段或方法签名。
  • 字节码验证:确保字节码不会破坏 JVM 的安全模型,例如非法的操作码或不合理的跳转指令。
  • 符号引用验证:验证所有符号引用指向的类和成员是否存在且可访问。

目的

验证阶段的存在是为了防止恶意代码或损坏的字节码对 JVM 造成危害,从而保障 JVM 的安全性和稳定性。




3. 准备 (Preparation)

定义与任务

准备阶段的主要任务是在方法区中为类变量分配内存空间,并设置默认初始值。需要注意的是:

  • 基本类型:为 byteshortint 分配 0long 分配 0Lfloat 分配 0.0fdouble 分配 0.0dchar 分配 \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 的“一次编写,到处运行”的强大特性。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.29.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值