类加载各个阶段

本文详细介绍了Java虚拟机的类加载过程,包括加载、连接、验证、准备、解析和初始化等阶段。强调了静态变量的分配和初始化时机,以及触发类初始化的各种情况。同时,讨论了不会导致类初始化的一些操作,如访问静态常量和创建类的数组等。

加载
将类的字节码载入方法区中,如果这个类还有父类没有进行加载,可以先加载父类。
加载和连接可能是交替运行的。在这里插入图片描述
连接
验证阶段:验证类是否符合jvm规范,安全性检查。
准备阶段:
static变量分配空间和赋值是两个步骤,分配空间在准备阶段完成,赋值在初始化阶段完成。
如果static变量是final的基本类型,那么编译阶段值就已经确定了,赋值在准备阶段完成。
如果static变量是final的,但属于引用类型,那么赋值也会在初始化阶段完成。
解析阶段:
将常量池中的符号引用解析为直接引用
初始化
初始化即调用()V,虚拟机会保证这个类的构造方法的线程安全
发生的时机:
概括的说,类的初始化时懒惰的
main方法所在的类,总会被首先初始化
首次访问这个类的静态变量或静态方法
子类初始化,如果父类还没初始化,会引发类初始化
子类访问父类的静态变量,只会触发父类的初始化
Class.forname
new会导致初始化

不会导致类初始化的情况
访问类的static final静态常量不会触发初始化
类对象.class不会触发初始化
创建该类的数组不会触发初始化
类加载器的loadclass方法
Class.forname的参数2为false

### JVM 类加载机制及各阶段详解 JVM类加载机制是一个复杂的过程,它涉及多个阶段的操作,主要包括 **加载**、**验证**、**准备**、**解析** **初始化**。以下是各个阶段的详细说明: #### 加载 (Loading) 在这一阶段JVM 将 `.class` 文件中的二进制数据读取到内存中,并将其存储在一个名为方法区的区域[^1]。在此过程中,JVM 还会生成一个 `java.lang.Class` 对象,用于表示该类或接口。 - 如果父类尚未加载,则先加载其父类。 - 查找并加载指定名称的类文件,通常由类加载器完成此操作。 ```python # 假设有一个简单的 Java 编译后的 class 文件 # 它会被加载JVM 中的方法区内存空间 ``` #### 验证 (Verification) 这是为了确保 `.class` 文件的字节流符合当前版本 JVM 的规范[^2]。验证的主要目的是保护 JVM 不受损坏的类文件影响,具体包括以下几个方面: - 文件格式验证:确认字节流是否符合 Class 文件格式标准。 - 元数据验证:检查类的元信息是否合法。 - 字节码验证:分析方法体内的指令集,确保不会破坏 JVM 的运行状态。 - 符号引用验证:确保所有的符号引用都能正确解析为具体的实体。 #### 准备 (Preparation) 在这个阶段JVM 会为类变量分配内存,并设置默认初始值(注意,此时实例变量不参与其中)[^3]。例如,对于静态字段,如果没有显式的赋值语句,默认情况下整型变量会被赋予 `0` 或其他类型的零值。 | 数据类型 | 默认值 | |----------|--------| | int | 0 | | long | 0L | | float | 0.0f | | double | 0.0d | 需要注意的是,在这一步骤中并不会执行任何代码逻辑;也就是说,即使存在带有副作用的表达式也不会被执行。 #### 解析 (Resolution) 解析指的是将常量池中的符号引用替换为直接引用的过程[^2]。所谓符号引用是以一组字符串形式存在的间接描述目标资源的方式;而直接引用则是指向内存地址的具体位置或者偏移量等可以直接定位的信息。 常见的几种需要解析的情况有: - 类或接口的解析; - 字段的解析; - 方法的解析; - 接口方法的解析。 #### 初始化 (Initialization) 最后也是最关键的一步就是初始化阶段,在这里会对类变量按照程序员编写好的代码顺序依次进行赋值操作以及执行静态代码块的内容[^3]。只有完成了这个步骤之后,我们才能真正意义上认为某个特定类别已经被完全装载到了 JVM 当前环境中可供正常使用了。 ```java // 示例代码展示如何触发类的初始化 public class Example { static { System.out.println("Static block executed"); } } new Example(); // 输出 Static block executed 表明已进入初始化阶段 ``` --- ### 总结 综上所述,整个 JVM 类加载流程涵盖了从原始 .class 文件读取直至最终形成可运作的状态之间所经历的一系列重要环节——即加载、验证、准备、解析初始化五个核心部分共同构成了完整的生命周期管理链条[^1][^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值