分代收集基于三大经验假说:弱分代假说(多数对象朝生夕灭)、强分代假说(存活越久越难消亡)、跨代引用假说(跨代引用极少),据此将堆划分为年轻代与老年代,分别采用复制算法和标记-清除/整理算法以优化GC效率。

分代收集不是凭空设计的机制,而是建立在大量实际运行数据之上的经验性抽象。它不追求“统一最优”,而是承认对象生命周期天然存在差异,并据此做出最务实的工程选择。
三大核心假说是整个分代逻辑的根基
弱分代假说指出:80%–90%的对象在创建后几毫秒至几秒内就不再被引用;强分代假说说明:熬过多次回收的对象,后续存活概率显著上升;跨代引用假说则观察到:老年代对象引用年轻代的情况极少,但年轻代引用老年代却很常见。
这三个假说共同决定了内存划分方式和算法选型方向——年轻代侧重快速清理短命对象,老年代侧重稳妥处理长存对象,而跨代引用必须被高效追踪(靠记忆集、卡表与写屏障)。
年轻代用复制算法,本质是“空间换时间”
Eden区占年轻代约80%,两个Survivor区各占10%(HotSpot默认8:1:1)。对象优先分配在Eden;Minor GC触发时,将Eden和一个Survivor中存活对象复制到另一个Survivor;清空原区域。
- 复制过程天然消除碎片,分配只需移动指针,极快
- Survivor区容量有限,若复制失败,剩余对象直接晋升老年代(分配担保)
- 对象每经历一次Minor GC,年龄+1;达到阈值(默认15)或Survivor放不下时,提前进入老年代
老年代不用复制,因代价太高
老年代对象多、存活率高、空间大,复制算法需要额外空间作备份,不现实。因此采用标记-清除或标记-整理:
- 标记-清除:先标记所有存活对象,再统一清理未标记的。缺点是产生内存碎片,可能引发频繁Full GC
- 标记-整理:标记后让存活对象向一端滑动,再清理边界外内存。解决碎片问题,但移动成本高,停顿更长
- CMS曾尝试并发标记降低停顿,但已被G1和ZGC逐步替代;G1则通过分区+预测模型,在延迟可控前提下兼顾吞吐
分代不是铁律,现代收集器正在弱化代际边界
从Serial、Parallel到CMS、G1,再到ZGC、Shenandoah,演进主线是:减少Stop-The-World时间、支持更大堆、适应云原生低延迟场景。G1虽保留代概念,但以Region为单位管理,按收益动态选择回收集;ZGC彻底取消代划分,靠着色指针与读屏障实现亚毫秒级停顿。
不过,分代理论仍是理解JVM内存行为的起点——哪怕新收集器不显式分代,其调度策略仍隐含着对对象寿命分布的建模与响应。

















