Skip to content
进阶

一句话答案

CMS 以最短停顿为目标,四阶段:初始标记(STW)→并发标记→重新标记(STW)→并发清除,缺点是内存碎片和浮动垃圾。

核心要点

已在 Q13 中详细描述,此处补充细节。

各阶段 STW 时间估计:

  • 初始标记:通常 < 10ms(只标记 GC Root 直接关联对象,数量少)
  • 并发标记:通常几百毫秒(与用户线程并发,不停顿用户线程)
  • 重新标记:通常 < 100ms(增量标记并发期间变化)
  • 并发清除:通常几百毫秒(与用户线程并发)

CMS 调优参数:

bash
-XX:CMSInitiatingOccupancyFraction=70   # 老年代占用70%时触发CMS(默认92%,太晚易CMF)
-XX:+UseCMSCompactAtFullCollection      # Full GC 时整理内存碎片
-XX:CMSFullGCsBeforeCompaction=5        # 每5次Full GC后整理一次碎片
追问与易错

追问方向:

  • CMS 和 G1 的区别?什么时候选 G1?
  • Concurrent Mode Failure 什么时候触发?
  • CMS 的内存碎片怎么解决?

易错点:

  • ❌ CMS 已经淘汰不用学——面试仍然高频考
  • ❌ 混淆 CMS 四个阶段的顺序

💡 记忆锚点

CMS四步舞:初始标记(短暂停)、并发标记(不停顿)、重新标记(短暂停)、并发清除(不停顿)。口诀"初并重并,停不停不"。代价:内存碎片(标记-清除不整理)和浮动垃圾(并发期间新产生的垃圾本轮收不掉)。