java对象生命周期分四阶段:创建(类加载完成→堆分配→零值初始化→设对象头→执行→赋引用)、使用(强可达即存活)、不可达(无强引用链→可标记回收)、回收(gc清理内存→复用空间),核心由引用控制决定存留。

Java 对象的生命周期由 JVM 自动管理,核心是围绕“是否还被程序需要”来判断对象存留与否,不依赖开发者手动释放。它不是简单的“生→死”,而是有明确阶段划分和内在逻辑的一套机制。
创建阶段:对象真正落地堆中
执行 new、反射、克隆或反序列化时触发。JVM 会严格按序完成:
• 检查类是否已完成加载、验证、准备、解析、初始化(5 步类加载)
• 在堆中分配内存(指针碰撞或空闲列表,取决于 GC 器)
• 将实例数据区域置为零值(int=0、引用=null)
• 设置对象头(含哈希码、锁状态、GC 年龄、类型指针)
• 执行
• 把堆中地址赋给栈中的引用变量,对象才可被访问
使用阶段:强可达即存活
只要存在一条从 GC Roots(如栈帧局部变量、静态字段、本地方法栈引用等)出发的强引用链能到达该对象,它就处于活跃状态:
• 可正常调用方法、读写字段、参与业务流程
• 局部变量超出作用域不影响——只要它被存进 List、Map 或赋给了 static 字段,仍算强可达
• 软/弱/虚引用在此阶段不改变可达性判定,只影响后续回收优先级
不可达阶段:回收前的标记状态
当所有强引用全部消失(如设为 null、从集合移除、离开作用域且无其他持有者),且无法从任何 GC Roots 追溯到该对象时,进入此阶段:
• 对象尚未被清理,只是被 GC 标记为“待回收候选”
• 若重写了 finalize()(不推荐),会被放入 F-Queue,由 Finalizer 线程异步执行一次
• finalize() 中若重新建立强引用(如赋给 static 字段),对象可能“复活”,但仅限一次,且行为不可靠、性能差
回收与释放阶段:内存真正归还
GC 线程在下一轮收集周期中对确认不可达的对象执行实际清理:
• 清除堆中对应内存(按算法不同:标记-清除、复制、标记-整理)
• 更新内存管理结构(如卡表、记忆集),为下次分配做准备
• finalize() 若存在且未执行过,会在回收前调用(但 JDK 9+ 已废弃,JDK 21+ 彻底移除)
• 对象占用的空间被 JVM 回收复用,不再属于该对象
本质上,管理的关键在于引用控制:避免静态集合长期持有无用对象、及时清理监听器或缓存、慎用 ThreadLocal 和内部类持外部引用——这些才是引发内存泄漏的主因。JVM 的 GC 是自动的,但对象“该不该活”,始终由你的引用设计决定。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











