分代收集是基于对象生命周期不均衡分布(80%对象短命、长命对象稀疏稳定)提出的优化策略,通过年轻代复制、老年代标记-整理、元空间独立管理实现高效回收,并逐步演进为动态调节与弱化代边界的现代GC范式。

分代收集不是凭空设计的优化技巧,而是对真实程序行为长期观察后提炼出的工程直觉。它的出现,本质上是为了解决“统一回收所有对象”带来的效率瓶颈。
对象生命周期的现实分布催生分代思想
早期JVM采用全堆扫描式回收,无论对象刚创建还是已存活数小时,都一视同仁。但大量监控数据表明:80%以上对象在几毫秒内就变成垃圾;而能活过几次Minor GC的对象,往往会长期驻留。这种极端不均衡的生命周期分布,让“一刀切”的回收策略既慢又浪费。
- 短命对象集中爆发 → 需要高频、轻量、快速回收
- 长命对象稀疏稳定 → 需要低频、稳妥、避免碎片
- 跨代引用极少 → 可用卡表(Card Table)等结构高效追踪,不必全堆扫描
从物理分区到逻辑适配的算法匹配
单纯把堆划成几块区域只是第一步。真正的跨越在于,为每个区域匹配最合适的回收算法:
- 年轻代用复制算法:利用“大部分对象死亡”的事实,只搬运存活对象,天然无碎片,分配快
- 老年代用标记-整理:对象少但体积大、寿命长,整理可复用空间,避免频繁扩容或Full GC
- 元空间独立管理类元数据:脱离堆内存,按需增长,规避永久代OOM问题
从静态划分到动态感知的机制升级
最初的分代是固定比例(如Eden:From:To = 8:1:1),但实际业务中对象晋升节奏差异很大。现代JVM逐步引入动态调节能力:
- 根据Minor GC后的存活率,自动调整晋升阈值(-XX:MaxTenuringThreshold)
- 依据老年代占用增速,提前触发混合回收(G1)或并发标记(CMS/ZGC)
- 通过GC日志与JFR采样,反馈调优参数,形成“监控→分析→调整”的闭环
从分代假设到弱化分代的渐进演进
分代收集极大提升了90年代至2010年代主流应用的GC效率,但它也有边界:大堆、长停顿、碎片压力等问题推动技术继续向前。G1开始模糊物理代界,ZGC和Shenandoah则进一步弱化分代概念,转而依赖染色指针、读屏障、并发重映射等底层机制实现亚毫秒停顿。分代没有消失,而是从显式结构变为隐式启发——它仍是理解GC行为的起点,但不再是唯一范式。

















