分代收集理论是依据对象生命周期差异将GC算法组合使用的策略框架,核心是新生代用复制算法、老年代用标记-清除或标记-整理,以时间换空间、分区提效率。

分代收集理论不是某种具体算法,而是把不同GC算法按对象生命周期特点组合使用的策略框架。它不替代标记、复制、整理这些基础动作,而是决定“在哪用、用哪个、怎么配”。
为什么必须分代?
因为对象存活时间差异巨大:98%的对象活不过一次Minor GC,而少数对象会持续运行数小时甚至整个应用周期。如果统一用一种算法处理全部对象,要么太慢(比如对短命对象做标记-整理),要么太碎(比如对长命对象只用复制算法浪费空间)。
分代的本质是用时间换空间,用分区换效率——把堆切成新生代和老年代,各自匹配最经济的回收方式。
新生代:复制算法为主,靠Survivor区流转
Eden区分配新对象,满时触发Minor GC。此时:
- 存活对象从Eden + From Survivor复制到To Survivor,年龄+1
- To Survivor空间不足或对象年龄≥阈值(默认15),直接晋升老年代
- 复制过程天然消除碎片,且只扫描活跃区域,速度快
两个Survivor区不是为了备份,而是为复制提供“交换空间”,避免每次GC都要额外申请内存。
老年代:标记-清除或标记-整理兜底
对象晋升进来后,存活概率高、体积大、GC频率低。这时复制算法代价太高(要预留同等大小空闲区),所以改用:
- 标记-清除:快但留碎片,适合CMS等低延迟场景(靠并发减少STW)
- 标记-整理:移动对象归并空间,无碎片但耗时长,适合Parallel Old等吞吐优先场景
元空间(类元数据)也用标记-清除,但触发条件更苛刻,通常只在类加载卸载剧烈时才回收。
组合不是静态拼接,而是动态协同
Minor GC频繁发生,但可能引发老年代连锁反应:
- 年轻代晋升失败(老年代没空间容纳新晋升对象)→ 触发Full GC
- 大对象直接分配进老年代(如字节数组),绕过新生代,可能加速老年代填满
- Minor GC后发现老年代剩余空间
真正有效的调优,不是单独调某个算法参数,而是观察代际间的数据流动——比如Survivor区过小导致提前晋升,或老年代碎片率高引发频繁Full GC。

















