CMS GC已成过去式

简介: CMS,全称“ Concurrent-Mark-Sweep”,是一款并发的、使用标记-清除算法的垃圾回收器,如果老年代采用CMS垃圾回收器,则需要在应用服务Java虚拟机启动参数中配置关键字:-"XX:+UseConcMarkSweepGC"。

       

      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,然后做出有意识的决定。


相关文章
|
1月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
4月前
|
算法 安全 Java
(七)JVM成神路之GC分代篇:分代GC器、CMS收集器及YoungGC、FullGC日志剖析
在《GC基础篇》中曾谈到过分代以及分区回收的概念,但基础篇更多的是建立在GC的一些算法理论上进行高谈阔论,而本篇则重点会对于分代收集器的实现进行全面详解,其中会涵盖串行收集器、并行收集器、三色标记、SATB算法、GC执行过程、并发标记、CMS收集器等知识,本篇则偏重于分析GC机制的落地实现,也就是垃圾收集器(Garbage Collector)。
111 8
|
5月前
|
算法 Java 云计算
JVM垃圾回收的历史演进:从GC算法到垃圾回收器选择
JVM垃圾回收的历史演进:从GC算法到垃圾回收器选择
|
6月前
|
算法 Java 应用服务中间件
jvm性能调优 - 13JVM的年轻代垃圾回收器ParNew原理
jvm性能调优 - 13JVM的年轻代垃圾回收器ParNew原理
128 1
|
缓存 算法 Java
JVM CMS GC算法解析
JVM CMS GC算法解析
80 0
|
机器学习/深度学习 算法 Java
大牛用十年功力带你彻底理解JVM垃圾回收器:ZGC,回收设计
ZGC的并发回收算法采用的也是“目的空间不变性”的设计,关于目的空间不变性的更多内容可以参考第7章。 在第7章中提到,Shenandoah从JDK 13开始也采用“目的空间不变性”的设计。但是ZGC与Shenandoah相比,还是有不少细节并不相同,如表8-3所示。
|
算法 Java
21-看懂CMS收集器工作机制
年轻代垃圾回收器机制我们都很清楚了,接下来我们介绍最核心的老年代垃圾回收环节。
122 0
21-看懂CMS收集器工作机制
|
Java
JDK8的shenandoah GC/zgc啥时能转正?
JDK8的shenandoah GC/zgc啥时能转正?
167 0
你们线上用的是什么垃圾收集器?G1的GC生命周期了解吗?
不知道大家在平常工作中有没有观察过自己公司线上项目用的是什么垃圾收集器,项目的JVM参数都是怎么配置的?
你们线上用的是什么垃圾收集器?G1的GC生命周期了解吗?
|
存储 算法 Java
JVM之历代垃圾收集器详解
JVM之历代垃圾收集器详解
199 0
JVM之历代垃圾收集器详解