java类生命周期含加载、验证、准备、解析、初始化、使用、卸载7阶段,前5阶段构成类加载过程;各阶段按序开始但常交叉执行,解析可延迟至初始化后以支持动态绑定。

Java 类的生命周期从字节码文件被读入 JVM 开始,到最终卸载出内存结束,其中加载、验证、准备、解析和初始化这五个阶段构成“类加载过程”的核心。它们不是完全串行执行,而是按固定顺序“开始”,但常交叉进行;尤其解析阶段可延迟,以支持多态和运行时绑定。
加载:把字节码变成 Class 对象
这是起点,目标是将 .class 文件(来自本地磁盘、JAR、网络甚至动态生成)读为二进制流,并在方法区(或 Metaspace)中创建对应的 java.lang.Class 实例。
- ClassLoader 负责定位与读取,不强制立即初始化——仅声明变量(MyClass x;)不会触发加载
- ClassLoader.loadClass("X") 默认只做到加载+部分解析,跳过初始化;Class.forName("X") 默认会触发初始化
- 加 -verbose:class 参数可观察哪些类真正完成了加载
验证:检查字节码是否安全合规
防止恶意或损坏代码破坏 JVM 运行环境,校验贯穿早期阶段,分四层:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 文件格式验证:检查魔数(0xCAFEBABE)、主次版本号、常量池结构等是否合法
- 元数据验证:确认继承关系是否合理(如 final 类未被继承)、访问修饰符是否越界
- 字节码验证:分析方法控制流,确保栈不会溢出、跳转不越界、类型操作合法
- 符号引用验证:检查常量池中引用的类、字段、方法是否存在且可访问
准备:为 static 字段分配内存并设默认值
仅针对类变量(static 修饰),在方法区分配空间,并赋予对应类型的零值(int→0、boolean→false、Object→null)。
- static int count = 10; → 准备阶段 count = 0,实际赋值在初始化阶段
- static final int X = 123;(编译期常量)→ 准备阶段直接设为 123,不进初始化
- static final String Y = new String("hello"); → 非编译期常量,必须等到初始化才赋值
解析:把符号引用转成直接引用
将常量池中的类、字段、方法等符号引用(比如 “java/lang/Object”、“hashCode:()I”)替换为内存中真实地址(如指针或偏移量)。
- 解析时机灵活:多数情况在初始化前完成,但为支持动态绑定(如接口方法调用、invokedynamic),可推迟到首次使用时
- 例如:某个接口方法在运行时才确定具体实现类,其方法符号引用就可能延后解析
初始化:执行类构造器 方法
这是真正给静态变量赋实际值、执行静态代码块的阶段,由 JVM 自动触发,且保证线程安全(JVM 会加锁确保只执行一次)。
- 触发条件包括:new 实例化对象、读写 static 字段(非 final)、调用 static 方法、反射调用、初始化子类前先初始化父类等
- 父类
总是在子类之前执行 - 接口的初始化不同:只有当真正使用其定义的 static 字段时才触发,且不要求先初始化父接口
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










