java对象生命周期为:堆中诞生→年轻代存活考验→晋升老年代→最终回收。创建时在eden区分配内存并初始化;minor gc时在survivor区复制转移并累加年龄;达阈值或大对象直接进老年代;major/full gc时标记清除或整理回收不可达对象。

Java 中对象的生命周期在内存中不是静态驻留,而是随程序运行、引用变化和垃圾回收机制动态流转的过程。整个过程严格依赖 JVM 的内存区域划分与对象可达性判定,核心路径是:**从堆中诞生 → 在年轻代中经历多次存活考验 → 可能晋升至老年代 → 最终被回收释放**。
对象诞生:在 Eden 区完成创建与初始化
执行 new 时,JVM 首先检查类是否已加载初始化;确认后,在堆的年轻代 Eden 区分配连续内存(通过指针碰撞或空闲列表);接着将内存空间除对象头外全部置为零值(int→0、Object→null);然后设置对象头(含 Mark Word 和类型指针),最后调用 <init></init> 方法完成字段赋值和构造逻辑。此时栈中局部变量保存的是该对象在堆中的地址引用,对象本身只存在于堆中。
对象存活:在年轻代 Survivor 区间反复转移
当 Eden 区满触发 Minor GC,JVM 采用可达性分析标记仍被强引用的对象,并把它们复制到一个 Survivor 区(如 S0)。下一次 GC 时,S0 中存活对象再复制到 S1,同时清空 S0。这个“来来回回”的过程会记录对象的分代年龄(GC Age),默认达到 15 次后晋升至老年代。注意:大对象(如大数组)可能直接绕过 Eden,通过 -XX:PretenureSizeThreshold 参数设定阈值后直接分配进老年代。
对象老化:进入老年代等待最终回收
晋升到老年代的对象通常生命周期较长、占用内存较大或已被多次验证为长期存活。老年代空间更大但 GC 频率更低,一般只有在空间不足或显式调用 System.gc()(不保证执行)时才触发 Major GC 或 Full GC。此时使用标记-整理或标记-清除算法回收不可达对象。若对象在老年代中彻底失去所有强引用链(即无法从 GC Roots 经任何路径访问),它就成为待回收目标。
对象终结:从内存中彻底消失
对象被回收前,JVM 会判断它是否重写了 finalize() 方法(已弃用)或注册了虚引用+引用队列——这是极少数可“复活”的机会,但仅限一次且不推荐依赖。绝大多数情况下,一旦被 GC 算法判定为不可达,其占用的堆内存就会被释放,地址空间归还给 JVM 内存池,后续 new 操作可能复用该区域。整个过程对开发者透明,但理解它有助于规避内存泄漏(如静态集合长期持有对象引用)或频繁 GC(如短命大对象滥用)等问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











