分代收集理论是一套基于弱分代、强分代和跨代引用三大假说的经验性设计原则,指导JVM将堆划分为新生代和老年代,并分别采用复制算法与标记-整理/清除算法以提升GC效率。

分代收集理论不是数学公式,而是一套基于大量真实程序行为总结出来的经验性设计原则。它的核心价值在于让垃圾回收更“懂”对象的生命周期,从而用更少代价完成更多回收工作。
三个关键假说决定了内存怎么划分
现代JVM堆之所以划分为新生代和老年代,直接源于三条观察性假说:
- 弱分代假说:绝大多数新创建的对象(比如方法里的局部变量、临时集合)存活时间极短,通常一次 Minor GC 就能清理掉98%以上
- 强分代假说:能挺过多次 Minor GC 的对象(比如缓存容器、连接池、单例实例),后续继续存活的概率显著升高,不适合频繁扫描
- 跨代引用假说:老年代对象引用新生代的情况非常稀少,因此 Minor GC 时不必扫描整个老年代,只需借助“记忆集(Remembered Set)”快速定位少量可疑区域
不同代对应不同回收策略
分代不是为了分类而分类,而是为匹配算法效率:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 新生代用复制算法:因为对象死亡率高、存活率低,把 Eden 和一个 Survivor 区的存活对象复制到另一个 Survivor 区,清空原空间,简单高效且无碎片
- 老年代用标记-整理或标记-清除:对象存活久、分布散、大对象多,复制成本太高;标记-整理可避免碎片,适合长期运行系统;CMS 曾用标记-清除追求低延迟(但有碎片风险)
- 元空间不参与传统分代回收:它在本地内存中管理类元数据,GC 条件苛刻,仅在元空间耗尽或显式触发时才清理,且主要用标记-清除
分代影响 GC 类型与停顿表现
理解分代,就等于看懂了 JVM 什么时候会卡住、为什么卡、卡多久:
立即学习“Java免费学习笔记(深入)”;
- Minor GC:只扫新生代,频率高但停顿短(毫秒级),由 Eden 区满触发
- Major GC / Old GC:仅 CMS 支持单独老年代回收;其他收集器一般不单独执行,常被 Full GC 吸收
- Full GC:扫描整个堆(含新生代、老年代、元空间),停顿长(百毫秒到秒级),应尽量避免——根本办法是控制对象晋升节奏、避免大对象直接进老年代、防止元空间泄漏
分代正在被重新审视
虽然分代仍是主流,但近年趋势显示它并非铁律:
- ZGC 和 Shenandoah 等低延迟收集器采用全堆并发标记,弱化代际边界,靠读屏障+染色指针实现几乎无停顿
- G1 是混合思路:逻辑上仍分代,但物理上将堆划为固定大小 Region,按需选择回收集(Mixed GC),兼顾吞吐与响应
- 某些云原生短生命周期应用(如 Serverless 函数),对象存活期极短且堆小,分代收益下降,甚至考虑无分代模式

















