分代收集理论基于对象生命周期规律动态划分内存,新生代用复制算法处理短命对象,老年代用标记算法管理长存对象,并通过记忆集优化跨代引用扫描。

分代收集理论的核心不是强行划分内存,而是顺应对象真实的生命周期规律。它不靠主观设定,而是基于大量实证——比如 IBM 研究指出约 98% 的对象在新生代一次 GC 后就消亡,而活过几次回收的对象,后续存活概率急剧上升。
新生代:专为“快进快出”设计
新生代聚焦处理高频创建、短命的对象。它被细分为 Eden 区和两个 Survivor 区(S0/S1),默认比例为 8:1:1。新对象优先分配在 Eden;Eden 满时触发 Minor GC,采用复制算法——只保留少量存活对象,把它们复制到空闲 Survivor 区,再清空 Eden 和原 Survivor。这种机制代价低、速度快,正契合“朝生夕灭”的特征。
- 每次 Minor GC 后仍存活的对象,年龄计数器 +1
- 对象在 Survivor 区间来回复制,若达到阈值(如默认 15 次)或 Survivor 空间不足,就晋升至老年代
- 大对象(如长数组)可能直接绕过新生代,分配到老年代,避免频繁复制开销
老年代:留给“稳定长存”的对象
老年代存放的是经多次 Minor GC 淘汰后依然存活的对象,以及直接分配的大对象。这里对象存活率高、回收频率低,不适合复制算法(空间浪费大、移动成本高),因此主流使用标记-清除或标记-整理算法。
- Major GC 或 Full GC 才会触达老年代,停顿时间通常明显长于 Minor GC
- 老年代空间不足时,可能触发担保失败(Promotion Failure),进而引发 Full GC
- JVM 会基于当前老年代剩余空间、历史晋升速率等动态估算是否安全晋升,避免贸然移动导致失败
跨代引用:用记忆集(Remembered Set)破局
单纯分区会带来一个关键问题:老年代对象引用新生代对象,会导致 Minor GC 时必须扫描整个老年代才能确认可达性——这完全违背了“轻量快速”的初衷。分代理论引入记忆集来解决。
- 记忆集是老年代的辅助数据结构,以卡表(Card Table)形式将老年代划分为固定大小(如 512 字节)的卡页
- 当老年代对象引用新生代对象时,对应卡页被标记为“脏”,Minor GC 时只需扫描这些脏卡页内的老年代对象作为 GC Roots 补充
- 这大幅缩小了扫描范围,使新生代回收保持高效,又不牺牲准确性
分代不是静态切片,而是动态演化的策略
分代收集不是一成不变的内存地图。对象年龄、晋升阈值、Survivor 之间的动态流转、记忆集的维护与清理,都在运行时持续调整。现代 JVM 还会结合 G1、ZGC 等新型收集器,在分代理论基础上进一步打破代际边界,用区域化(Region)和并发标记实现更精细的控制。
本质上,它是对现实经验的高度抽象:对象有寿命分布,内存回收就得按需定制节奏与方式。

















