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


相关文章
|
2月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
缓存 算法 Java
JVM CMS GC算法解析
JVM CMS GC算法解析
88 0
|
算法 Java
21-看懂CMS收集器工作机制
年轻代垃圾回收器机制我们都很清楚了,接下来我们介绍最核心的老年代垃圾回收环节。
133 0
21-看懂CMS收集器工作机制
|
机器学习/深度学习 算法 Java
大牛用十年功力带你彻底理解JVM垃圾回收器:ZGC,回收设计
ZGC的并发回收算法采用的也是“目的空间不变性”的设计,关于目的空间不变性的更多内容可以参考第7章。 在第7章中提到,Shenandoah从JDK 13开始也采用“目的空间不变性”的设计。但是ZGC与Shenandoah相比,还是有不少细节并不相同,如表8-3所示。
|
算法 Java UED
深入解析CMS垃圾回收器
在CMS之前的垃圾回收器,要么就是串行垃圾回收方式,要么就是关注系统吞吐量,而 CMS 垃圾回收器的出现,则打破了这个尴尬的局面。
346 0
深入解析CMS垃圾回收器
|
Arthas 缓存 监控
JVM调优之G1换CMS
SIZE: 进程使用的地址空间,如果进程映射了 100M 的内存,进程的地址空间将报告为 100M 内存。事实上,这个大小不是一个程序实际使用的内存数。
JVM调优之G1换CMS
|
前端开发 Java
Java虚拟机 CMS GC 调优解析
随着 JDK 版本的不断升级,其 GC 策略也随之不停革新,从早期的 1.4 到如今的 11(本文仅讨论在线上环境落地规模较大的版本),其对应的 GC 策略也随之由 Serial、Parallel、CMS 演进至当前的 G1 甚至即将落地的 ZGC 。每一次的调整无不是基于环境的适配性以及业务场景特性,无论如何,只要能够基于特定的操作系统内核、物理内存、JDK版本以及业务特性,达到收益最大化,采用何种实现策略都不为过。当然,还是建议大家以官方的推荐为准,基于自己的业务场景进行不断优化调整,这样才能保证万无一失,使得我们的业务能够健康发展。
180 0
|
算法 安全 Java
JVM - CMS深度剖析
JVM - CMS深度剖析
194 0
|
算法 NoSQL Java
深入理解JVM - CMS收集器
上一篇文章我们讲解分代的基础理论,同时讲解了新生代和老年代各自的算法复制算法和标记整理算法,之后我们总结了新生代进入老年代的条件,在最后我们介绍的引用类型,同时进行了练习的提问和相关的解答。
99 0
|
存储 算法 Java
小师妹学JVM之:GC的垃圾回收算法
小师妹学JVM之:GC的垃圾回收算法
小师妹学JVM之:GC的垃圾回收算法