在G1出来之前,CMS绝对是OLTP系统的标配。即使G1出来几年了,生产环境很多的JVM实例还是采用ParNew+CMS的组合。但是即使其得到这么广泛的应用,还是有很多同学对它有很深的误解。本文主要对ParNew+CMS经典组合下,触发的几种垃圾回收方式进行几个概念的纠正。
Backgroud CMS
可能更多人只知道CMS,而不知道Backgroud CMS。事实上我们说的CMS,即包含了5个阶段的CMS,就是Background CMS,如下图所示:

说明:
- 图中初始化标记阶段是串行的,这是JDK7的行为。JDK8以后默认是并行的,可以通过参数
-XX:+CMSParallelInitialMarkEnabled控制。 - 由图可知,CMS还有两个阶段是完全STW(Stop The World)的,即初始化标记和最终标记(重新标记)。
- 其他阶段都是并发的,所以CMS被称为
Concurrent Mark&Sweep,但是我认为前面还需要加个Mostly才是最贴切,即CMS是一个Mostly Concurrent Mark and Sweep Garbage Collector,因为它还没办法做到完全并发。
不只是CMS,就是G1,以及JDK11的ZGC都没有做到完全的并发。就目前笔者了解到的所有GC中,只有Azul的C4是完全并发的。
为什么有个Background关键词?我们都知道配置

CMS是JVM中一种常用的垃圾回收器,常与ParNew配合使用。本文详细介绍了CMS的几种工作模式:Background CMS、Foreground CMS和MSC(Mark Sweep Compact)。Background CMS大部分阶段并发执行,但仍有Stop The World阶段。Foreground CMS在内存不足时触发,全程STW,效率较低。而MSC是一种标记-清理-压缩算法,用于解决碎片问题。通过调整参数可以避免或减少FullGC,以降低对业务的影响。

2523

被折叠的 条评论
为什么被折叠?



