java类生命周期共7个阶段:加载→验证→准备→解析→初始化→使用→卸载;其中加载、验证、准备、初始化顺序固定,解析可延迟至首次使用时,初始化才执行静态赋值和代码块。

Java 类的生命周期,指的是一个类从被 JVM 认识到最终从内存中清除的全过程。它不是一次性线性走完的流水线,而是一组有顺序约束、但常交叉执行的阶段。理解的关键在于:哪些阶段必须先开始、哪些值何时真正赋值、哪些动作由什么触发。
加载(Loading):让 JVM “看见”这个类
这是整个生命周期的起点。JVM 根据类的全限定名(如 java.lang.String),通过类加载器(ClassLoader)从各种来源(文件系统、JAR、网络、甚至动态生成)读取 .class 字节码,并将其载入方法区(Metaspace)。同时,在堆中创建一个 java.lang.Class 对象,作为该类在 JVM 中的运行时入口。
- 触发时机常见于:new 实例化、访问静态字段/方法、反射(Class.forName())、子类初始化时父类尚未加载等
- 注意:此时类还没“活”起来——静态变量只是占了内存位置,值还是默认值(0、null、false)
验证(Verification)与准备(Preparation):安全检查 + 内存铺路
验证确保字节码合法、安全,不破坏 JVM 稳定性;准备则为类的静态变量(类变量)分配内存并设为默认初值(比如 int x; → x = 0,不是代码里写的 = 5)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 验证包括:文件格式校验、元数据验证、字节码验证、符号引用验证
- 准备阶段不执行 Java 代码,也不调用任何静态块或构造器;final static 基本类型若在编译期能确定值,会在此阶段直接赋值(属于特例)
解析(Resolution):把“名字”变成“地址”
将常量池中的符号引用(如类名、方法名、字段名等文本描述)替换为运行时可直接使用的直接引用(如内存地址、偏移量)。这个阶段具有灵活性——可能在初始化前完成,也可能延迟到首次主动使用时才做(例如调用某个方法时才解析该方法的符号引用)。
- 支持 Java 的动态绑定和多态:方法重写、接口实现的真正目标,不一定在类加载初期就锁定
- 典型例子:接口方法调用、虚方法分派,其具体实现类可能到运行时才确定
初始化(Initialization):真正执行 Java 逻辑的第一步
这是类“真正活过来”的时刻。JVM 执行类的
- 触发条件严格定义(JVM 规范):首次 new 对象、调用静态方法、访问静态字段(非 final)、反射、初始化子类前先初始化父类、JVM 启动时标记为启动类的主类
- 注意:static final 基本类型常量在准备阶段就已赋值,不会等到初始化;而 static final String 或其他引用类型,若值在编译期不确定,则延迟到初始化阶段
使用与卸载:运行中与退出后
“使用”不是独立阶段,而是指类初始化完成后,被程序正常调用的过程(实例化、方法调用、字段读写等)。而“卸载”仅发生在满足三个条件时:该类所有实例已被回收、加载该类的 ClassLoader 已被回收、该类对应的 java.lang.Class 对象没有被任何地方引用(即不可达)。只有满足全部条件,JVM 才可能在 Full GC 时卸载类——这在 Web 容器热部署、OSGi 等场景中较常见,普通应用极少主动观察到。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










