CMS,全称“ Concurrent-Mark-Sweep”,是一款并发的、使用标记-清除算法的垃圾回收器,如果老年代采用CMS垃圾回收器,则需要在应用服务Java虚拟机启动参数中配置关键字:-"XX:+UseConcMarkSweepGC"。
使用场景:GC过程短暂停,适合对时延要求较高的服务,用户线程不允许长时间停顿。
算法缺点: 存在严重的内存碎片化。 另外,算法实现比较复杂。
CMS GC 核心要点回顾:
1、CMS(Concurrent Mark Sweep,并发-标记-清除)是目前最常用的 JVM 垃圾回收器,这里不解释 CMS 的工作过程,只记录一些基础要点以帮助理解后面的内容:
CMS 是一种基于并发、使用标记清除算法的垃圾回收器。CMS 会尽可能让 GC 线程与用户线程并发执行,可以消除长时间的 GC 停顿(STW)。
2、CMS 不会对新生代做垃圾回收,默认只针对老年代进行垃圾回收。此外,CMS 还可以开启对永久代的垃圾回收(或元空间),避免由于 PermGen 空间耗尽带来 Full GC,JDK6以上受参数 -XX:+CMSClassUnloadingEnabled 控制,这个参数在 JDK8 之前默认关闭,JDK8 默认开启了。
3、CMS 要与一个新生代垃圾回收器搭配使用,所谓"分代收集"。能与 CMS 配合工作的新生代回收器有 Serial 收集器和 ParNew 收集器,我们一般使用支持多线程执行的 ParNew 收集器。
4、使用 CMS GC 策略时,GC 类别可以分为:Young GC(又称 Minor GC),Old GC(又称 Major GC、CMS GC),以及Full GC。其中 Full GC 是对整个堆的垃圾回收,STW 时间较长,对业务影响较大,应该尽量避免 Full GC。
然而,从Java 9开始,如果使用-XX:+ UseConcMarkSweepGC(将激活CMS GC算法的参数)启动应用程序,将在下面看到警告消息:
Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
为什么不推荐使用我们的CMS?
打个比方,你去坐飞机参加外地的学习交流,如果要携带很多行李,则很难快速前进。CMS也是如此。CMS是一种高度可配置的复杂算法,因此给JDK中的GC代码库带来了很多复杂性。只有JDK开发团队可以简化GC代码库,他们才能在GC领域加速和创新。下表总结了可以传递给每个GC算法的JVM参数的数量:
GC Algorithm |
JVM arguments(approximately) |
Common to all |
50 |
Parallel |
6 |
CMS |
72 |
G1 |
26 |
ZGC |
8 |
可以将大约50个与GC相关的参数传递给JVM,这对于所有GC算法都是通用的。除了这50个参数之外,仅对于CMS,您还可以传递72个附加参数。如上表所示,此参数比任何其他GC算法都要多得多。因此,您可以看到JDK团队支持所有这些参数所需的编码复杂性。
如果使用CMS,下一步将面临什么?
据我所知,我眼前看到三个不同的选择:
让我们探索本节中的每个选项。
1、切换到G1 GC算法
自Java 9以来,G1 GC已成为默认的GC算法。因此,您可以考虑将应用程序移至该算法。它可能提供比CMS GC算法更好的性能特征。调整相对容易得多,因为参数的数量相对较少。此外,它提供了从内存中消除重复字符串的选项。如果您可以消除重复的字符串,则可以帮助您减少总体内存占用。
2、切换到Z GC算法
Z GC是可伸缩的,低延迟的垃圾收集器。其目标是使GC暂停时间小于10ms。Java 11和12中提供了对Z GC算法的早期访问。因此,如果您的应用程序在Java 11或12上运行,则可以考虑升级到Z GC算法。我们对Z GC的初步分析显示了出色的结果。
3、继续进行CMS
对于某些应用程序,即使经过大量调整,我们也发现CMS可以提供G1 GC无法提供的出色结果。因此,如果您已经探究了其他两个选项,并且确信CMS算法是您在天堂中为您的应用程序所做出的成功,则可以考虑使用CMS算法本身来运行。在此OpenJDK JDK9-dev邮件列表中甚至还有继续使CMS保持有效状态的争论。根据我个人的经验,我看到Java 1.1中不推荐使用的功能和API甚至在Java 12中(即使20年之后)仍然存在。似乎所有已弃用的API和功能似乎都可以保留(并且永远不会消失)。因此,继续在CMS上运行也是一种选择。
因此,每个应用程序都是唯一且不同的。因此,不要被您在互联网上发现的有关GC调整/调整(包括本文)的期刊和文献所吸引。当您测量新的GC设置时,请进行彻底的测试,对性能特征进行基准测试,研究这些KPI,然后做出有意识的决定。