CMS 和 G1 的区别?

发布于

一、CMS

  • 基于标记-清除算法。
  • 以最短停顿时间为目标。
  • 流程:初始标记(STW)→ 并发标记 → 重新标记(STW)→ 并发清除。
  • 缺点:内存碎片、并发阶段消耗 CPU、浮动垃圾、可能 Concurrent Mode Failure 退化为 Serial Old。

二、G1

  • 把堆分成多个 Region,每个 Region 可充当 Eden/Survivor/Old/Humongous。
  • 整体标记-整理,局部复制,无碎片。
  • 可预测停顿时间:根据每个 Region 的回收价值,优先回收垃圾多的 Region。
  • 流程:初始标记 → 并发标记 → 最终标记 → 筛选回收(STW)。

三、选择

  • 堆较小、追求低延迟 → CMS。
  • 堆大(>4G)、可预测停顿 → G1(JDK 9 默认)。