分代收集理论基于弱分代假说(多数对象朝生夕灭)和强分代假说(存活越久越难消亡),将堆划分为年轻代(eden+s0+s1,用复制算法)与老年代(用标记-清除/整理算法),以提升gc效率。

分代收集理论不是凭空设计的规则,而是基于大量真实程序运行数据总结出的经验模型。它把堆内存按对象“年龄”切分成年轻代和老年代,核心依据是两个被反复验证的假说:绝大多数对象刚创建就失效(弱分代假说),而活过几次回收的对象往往能活更久(强分代假说)。
为什么按“代”划分?
因为不同生命周期的对象,回收方式完全不同:
- 新生代里 98% 的对象撑不过第一次 Minor GC,复制算法效率最高——只搬存活对象,清空整块区域,快且无碎片
- 老年代对象存活率高,复制成本太大,更适合标记后清理或整理,哪怕慢一点也要保证空间连续可用
- 跨代引用极少,所以可以用记忆集(Remembered Set)等轻量机制追踪,避免每次 GC 都扫描全堆
年轻代怎么运作?
默认采用 Eden:Survivor0:Survivor1 = 8:1:1 的三区结构:
- 新对象一律进 Eden 区
- Eden 满触发 Minor GC:存活对象复制到一个 Survivor 区(比如 S0),Eden 和另一个 Survivor(S1)清空
- 下次 GC 时角色互换,持续交换;对象每熬过一次,年龄 +1
- 达到阈值(默认 15,可通过 -XX:MaxTenuringThreshold 调整)或 Survivor 空间不足,就晋升到老年代
老年代回收的关键逻辑
它不追求频率,而重稳定性:
- 没有“备用空间”做复制,所以不能用复制算法
- 标记-清除适合 CMS(低延迟场景),但会碎片化;标记-整理适合 Parallel Old 或 Serial Old(吞吐优先),代价是移动对象耗时
- 一旦老年代空间不足,可能触发 Full GC,影响范围大,因此要避免对象过早晋升或内存泄漏
分代不是静态隔离,而是动态协作
Minor GC 后,部分对象进入老年代;G1 收集器还能混合回收(Young + 部分 Old);CMS 虽主打老年代并发收集,但也依赖年轻代配合。分代的本质,是让 GC 在合适的时间、用合适的算法,处理合适的生命阶段对象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











