标记-整理算法在老年代回收中起“稳结构、防碎片、保大对象分配”核心作用,通过移动存活对象实现紧凑排列,消除碎片以保障大对象分配,虽STW较长但换得长期稳定。

标记-整理算法在老年代回收中起的是“稳结构、防碎片、保大对象分配”的核心作用。它不追求单次最快,而是用一次可控的停顿,换来长期稳定的内存布局和可靠的分配能力。
解决老年代高存活率带来的移动难题
老年代对象普遍存活时间长、比例高(常达80%–95%),复制算法要搬动大量对象,还得预留等量空闲空间,成本太高;标记-清除则只清理不整理,很快堆满细碎空洞。标记-整理只移动存活对象,不浪费一半内存,又避免了无效复制——它把“必须动”和“动得值”结合了起来。
- 只处理存活对象,跳过已确认的垃圾,减少扫描与搬运量
- 按地址顺序紧凑排列,天然适配现代CPU缓存局部性,提升后续访问效率
- 移动过程可批量处理(如按内存页分组),JVM底层通过卡表(Card Table)加速引用更新
消除碎片,保障大对象顺利分配
缓存块、批量响应体、长生命周期的连接池实例等,往往体积大、分配频次低但关键。一旦老年代碎片化,即使总空闲空间充足,也会因找不到连续区域而触发 Full GC。标记-整理回收后,所有存活对象紧靠一端,边界外是完整连续空间,大对象分配不再“看运气”。
- 整理后 used 值接近 capacity × 实际存活率,说明无显著残留碎片
- 日志中出现 compact、defrag 或 PSMarkSweep/MarkSweep 字样,即表示整理已生效
- 对比 GC 前后老年代的 used/capacity 比值变化平滑,而非锯齿状波动,反映分配稳定性提升
匹配老年代低频但高影响的GC特性
老年代 GC 不频繁,但每次暂停直接影响服务响应。标记-整理接受单次较长 STW(尤其在移动+更新引用阶段),换来的却是数小时甚至数天内无需再为碎片担忧。这种“以时间换空间、以停顿换稳定”的权衡,恰恰契合服务类应用对长尾延迟和可用性的严苛要求。
- 标记阶段耗时与存活对象数量正相关,而非整个堆大小,对大堆更友好
- Serial Old、Parallel Old 默认采用该算法;G1 的混合回收也借鉴其整理逻辑,只是粒度更细
- CMS 因放弃整理最终退化为 Serial Old 执行一次 Mark-Sweep-Compact,反向印证了整理不可替代
它不是万能解法,但对老年代来说,是目前最务实、最经得起长期运行考验的选择。

















