cms减少停顿的核心是仅初始标记和重新标记阶段stw,其余并发执行;通过分阶段标记、并发线程利用、提前触发回收等设计实现低延迟。

CMS 减少停顿时间的核心思路是:把耗时长的操作尽量放到与用户线程并发执行,只保留少量、轻量的阶段做 Stop-The-World(STW)。
它不追求吞吐量最大化,而是专注压缩 GC 导致的应用暂停,特别适合对响应延迟敏感的系统(比如 Web 服务、交易接口)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
CMS 四个阶段中哪些会停顿、哪些不会
初始标记(Initial Mark):需要 STW
只扫描 GC Roots 直接关联的老年代对象 + 新生代中可能引用老年代的对象(常借 Young GC 的 STW “搭便车”完成),非常快。并发标记(Concurrent Mark):不 STW
GC 线程和用户线程一起跑,遍历整个老年代对象图。这是最耗时的阶段,但用户完全无感。重新标记(Remark):需要 STW
修正并发标记期间因用户线程修改引用而产生的漏标。耗时比初始标记长,但远短于串行全堆扫描;可通过-XX:+CMSScavengeBeforeRemark触发一次 Young GC,减少跨代引用扫描量,进一步缩短该阶段。并发清除(Concurrent Sweep):不 STW
清理已标记的垃圾对象,用户线程照常运行。注意:用的是标记-清除算法,不整理内存,所以会产生碎片。
关键设计保障低停顿
- 并发执行为主:两个最耗时的阶段(标记、清除)都与用户线程并发,STW 仅发生在两处且极短。
- 分阶段细化标记:把原本一次长停顿的“全量标记”拆成“快标 + 并发标 + 快修”,避免单次长时间卡顿。
-
利用硬件资源:通过
-XX:ConcGCThreads设置并发 GC 线程数(如设为 CPU 核数的 1/4~1/2),让多核真正为低延迟服务。 -
主动控制触发时机:用
-XX:CMSInitiatingOccupancyFraction提前启动 CMS(比如设为 70),避免老年代快满才回收,降低并发模式失败(Concurrent Mode Failure)风险——这种失败会导致退化为 Serial Old 的 Full GC,停顿陡增。
容易被忽略但影响停顿的关键点
- 浮动垃圾无法本轮回收,但不会导致 STW 延长;真正危险的是并发模式失败,必须靠合理设置触发阈值+足够空闲老年代空间来规避。
- 初始标记在 JDK 8+ 默认已支持并行(启用
-XX:+CMSParallelInitialMarkEnabled),能进一步缩短首次 STW。 - 不要忽略新生代配置:CMS 通常搭配 ParNew 使用,Young GC 频率和停顿也会影响整体响应,需同步调优。
CMS 的低停顿不是靠“快”,而是靠“躲”——把重活挪到后台干,前台只留几毫秒的事。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










