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 默认)。