经典收集器(中):CMS 的前世今生
本文是《JVM调优实战》专栏第 12 讲。
引言
如果说 Serial、Parallel 代表了GC的"老派作风"——你做你的GC,应用线程乖乖等着——那么CMS(Concurrent Mark Sweep)就是第一个敢于挑战"STW暴政"的革新者。它的核心理念简单而大胆:让GC线程和应用线程同时工作,从而大幅缩短停顿时间。
CMS曾风光无限,是互联网时代Java服务端应用的首选收集器。但任何技术都有其生命周期,CMS的辉煌最终止于JDK 14的彻底移除。理解CMS,不仅是为了读懂历史代码的GC配置,更是为了明白后来的G1、ZGC解决了什么问题。
本讲我们将沿着"设计目标→工作流程→致命缺陷→退场原因"这条线,完整回顾CMS的前世今生。
CMS 的设计哲学
CMS的全称是Concurrent Mark Sweep,从名字可以看出两个关键信息:
- Concurrent(并发):大量工作与用户线程同时执行,不产生长时间STW
- Mark Sweep(标记-清除):使用标记-清除算法,而非标记-复制或标记-整理
CMS的目标非常明确:以最短的回收停顿时间为目标。它专为那些对响应时间敏感的应用设计——比如Web服务器、在线交易系统、即时通讯——