分代收集理论的核心是按对象存活时间划分内存区域并匹配最优回收算法:新生代用复制算法处理短命对象以实现低延迟,老年代用标记-清除或标记-整理算法应对长期存活对象以保障吞吐与稳定。

分代收集理论的核心,是把“对象活多久”和“用什么方式回收它”直接挂钩。不是所有对象都该被一视同仁地处理——刚创建的临时对象可能只用几毫秒,而缓存、连接池、单例这些对象可能贯穿整个应用生命周期。JVM 把堆内存按对象预期存活时间切分成不同区域,再为每个区域选最省事、最高效的回收算法。
新生代:短命对象多,复制比标记快得多
绝大多数新对象(比如方法里 new 出来的 String、局部集合)生命周期极短,一次 GC 就能清理掉 95% 以上。这种场景下,复制算法最合适:
- Eden 区满了就触发 Minor GC,只扫描 Eden + 一个 Survivor 区
- 把还活着的对象一次性复制到另一个 Survivor 区,原区域整块清空
- 复制成本低——因为真正要搬的只有极少数存活对象
- 天然解决内存碎片问题,后续分配新对象时不用找空闲块
老年代:长期存活对象多,不能靠复制硬搬
能熬过多次 Minor GC 晋升上来的对象,大概率还会继续活很久。老年代空间大、对象密集、存活率高,复制算法在这里不现实:
- 没有足够备用空间做“复制搬迁”,无法担保分配
- 若强行复制,每次都要搬大量对象,停顿时间不可接受
- 所以改用标记-清除或标记-整理:先标记哪些还活着,再统一清理或压缩
- 虽然单次耗时比复制长(慢 10 倍左右),但触发频率低,整体开销更可控
晋升机制是关键桥梁
分代不是静态划分,而靠对象年龄动态流转:
- 每次 Minor GC 后仍存活的对象,年龄 +1;默认达到 15 次(可通过 -XX:MaxTenuringThreshold 调整)就进入老年代
- 大对象(如大数组)可能直接分配到老年代(-XX:PretenureSizeThreshold 控制)
- Survivor 空间不足时,部分对象也会提前“幸存者溢出”进老年代
算法匹配本质是权衡效率与资源
所谓“最佳”,不是技术上最先进,而是最贴合实际行为:
- 新生代追求低延迟:复制算法用空间换时间,换来的是毫秒级停顿
- 老年代追求吞吐与稳定性:标记类算法牺牲一点速度,换来对大堆、长周期的适应性
- 没有一种算法通吃全部,分代让 JVM 在不同压力点各司其职

















