堆内存分代设计的根本目的是让垃圾回收更聪明、更快、更少停顿;基于对象生命周期差异将短命对象集中于新生代、长寿对象置于老年代,配合复制算法与标记整理/清除算法,并减少stw停顿和无效扫描。

堆内存分代设计,根本目的就一个:让垃圾回收更聪明、更快、更少停顿。
基于对象生命周期差异做精准回收
现实中的Java对象不是“一视同仁”的——约90%的对象刚创建不久就不再被使用(比如方法内临时字符串、循环变量),而剩下10%可能贯穿整个应用生命周期(如Spring容器里的Bean、全局缓存)。如果所有对象混在一块,每次GC都得扫描全部堆空间,效率极低。分代把“短命对象”集中到新生代,“长寿对象”放在老年代,GC就能按需出击:多数时候只扫新生代,避开大量稳定对象。
用不同算法匹配不同区域特征
- 新生代用复制算法(Copying):存活对象少,只需把它们复制到Survivor区,原Eden区直接清空,速度快、无碎片;
- 老年代用标记-整理(Mark-Compact)或标记-清除(Mark-Sweep):对象存活率高,复制成本太高,更适合原地清理+压缩;
- 元空间(Java 8+)不属堆内,专管类元数据,基本不参与常规GC,避免干扰对象回收。
大幅降低STW停顿时间
Minor GC只处理新生代,通常几毫秒完成;而Full GC要扫描整个堆+元空间,可能耗时上百毫秒甚至更久。分代后,95%以上的GC都是Minor GC,用户线程暂停几乎感知不到。一旦不分代,频繁全堆扫描会让响应延迟飙升,尤其对高并发、低延迟场景(如交易系统、实时推送)影响致命。
减少不必要的内存扫描和移动
对象晋升有明确规则:在Survivor区熬过几次Minor GC(默认阈值15次)、或大对象直接分配,才进入老年代。这保证了老年代“干净”——没有大量临时对象掺杂其中。GC不用为它们浪费CPU周期,也不用反复搬运存活对象。同时,新生代的Eden:S0:S1比例(如8:1:1)也是为复制算法服务:留足Eden空间容纳新对象,两个Survivor轮换承接幸存者,避免频繁触发晋升。










