前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CMS GC已成过去式

CMS GC已成过去式

作者头像
Luga Lee
发布2021-12-09 20:11:10
1.1K0
发布2021-12-09 20:11:10
举报
文章被收录于专栏:架构驿站

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算法的参数)启动应用程序,将在下面看到警告消息:

代码语言:javascript
复制
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,然后做出有意识的决定。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档