分代收集理论是基于弱分代假说、强分代假说和跨代引用假说三大经验性观察形成的指导原则,通过划分新生代与老年代并匹配不同回收算法,实现gc资源的智能分配与高效执行。

分代收集理论不是一套硬性规则,而是一套基于大量实际程序运行规律总结出来的经验性指导原则。它的核心价值在于让垃圾回收这件事变得更“聪明”——不平均用力,而是按对象的生命周期特征来分配资源和策略。
它建立在三个关键观察之上
第一,绝大多数新创建的对象很快就会失效(弱分代假说)。比如方法里临时生成的字符串、循环中的局部对象,用完即弃。
第二,能活过多次回收的对象,往往会长期存在(强分代假说)。比如单例、缓存容器、连接池等,它们大概率会一直用到应用结束。
第三,跨代引用非常少(跨代引用假说)。一个老年代对象频繁引用新生代对象的情况极少;反过来,新生代对象引用老年代对象虽有,但比例很低。
直接催生了堆内存的物理划分
因为对象“死得快”和“活得久”是两种典型模式,JVM 就把堆划成新生代和老年代:
- 新生代专注处理“短命对象”,采用复制算法(如 Eden + Survivor),回收快、无碎片、停顿短
- 老年代存放“长寿对象”,空间大、存活率高,适合用标记-清除或标记-整理,避免频繁复制开销
- 这种分区也让 GC 类型有了明确语义:Minor GC 只扫新生代,Major GC 针对老年代,Full GC 才整堆清理
决定了不同区域该用什么回收算法
分代不是为了划区而划区,而是为算法匹配提供依据:
- 新生代对象死亡率常超 98%,复制算法只需搬走 2% 的存活对象,效率极高
- 老年代无法承受复制成本(没那么多空闲空间做担保),且对象密集,标记-清除或标记-整理更稳妥
- 像 G1、ZGC 这类新型收集器虽弱化分代边界,但仍隐含分代思想——例如 G1 的 Region 分组、ZGC 的染色指针设计,本质仍是按对象活跃度做差异化处理
让调优有了可抓手的维度
理解分代,就等于掌握了 GC 行为的“地图”:
- 频繁 Minor GC?先看 Eden 是否太小,或对象晋升太快(Survivor 空间不足、年龄阈值偏低)
- 老年代增长快甚至触发 Full GC?可能是内存泄漏,也可能是新生代对象过早晋升(如大对象直接进老年代)
- 停顿时间超标?得区分是新生代复制延迟,还是老年代标记/整理耗时,再选对应收集器(如 Shenandoah 专攻低延迟老年代回收)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











