标记-整理算法用于老年代以解决内存碎片问题并避免复制开销,其因对象存活率高、回收频率低而适用;执行分标记、整理、清理三步,需更新引用但无碎片;HotSpot中由Serial Old等收集器采用。

标记-整理算法主要用在老年代垃圾回收中,核心目的是解决标记-清除算法带来的内存碎片问题,同时避免复制算法的高空间开销。
为什么老年代适合用标记-整理
老年代对象存活率高、回收频率低。如果用复制算法,每次都要搬运大量存活对象,效率极低;如果用标记-清除,长期运行后会产生大量不连续空闲块,导致大对象无法分配(即使总空间足够),进而触发不必要的Full GC。标记-整理通过“移动+压缩”让存活对象靠拢一端,腾出连续的大块空间,兼顾空间利用率和分配效率。
标记-整理的具体执行步骤
- 标记阶段:从GC Roots出发,遍历并标记所有可达对象(与标记-清除一致)
- 整理阶段:将所有被标记的存活对象按地址顺序向内存起始端(如低地址)紧凑移动
- 清理阶段:直接清空整理后边界之外的所有内存,得到一块完整可用空间
实际影响与调优注意点
该算法在HotSpot中被Serial Old、Parallel Old等收集器采用。它不产生碎片,但整理过程需更新所有指向这些对象的引用(包括栈、寄存器、其他对象字段),带来一定开销。当老年代空间紧张且碎片严重时(比如VisualVM中观察到“碎片率高、晋升失败频繁”),说明标记-整理正在起作用;若发现停顿时间过长,可考虑切换为G1或ZGC等更现代的收集器。
和新生代回收的关键区别
新生代用复制算法——因为对象大多朝生夕死,只需复制少量存活对象;老年代用标记-整理——因为对象普遍活得久,复制成本太高,而碎片又不能不管。这种分工正是分代收集思想的直接体现。

















