垃圾收集器-CMS

CMS垃圾收集器


前言

相信大家都或多或少的了解过hotspot虚拟机的垃圾收集器,无论是初代的serialGc(单线程的垃圾收集器),还是到后面JDK1.8默认使用的paraller scanvenage(多线程垃圾收集器),这些垃圾收集器在我们的工作学习中或多或少都有一些指导的意义。而今天我要在这边和大家介绍的垃圾收集器是CMS垃圾收集器。

提示:以下是本篇文章正文内容,下面的文章结合网上的观点和自己的理解,欢迎各位大佬来指点

一、CMS是什么?

CMS(Concurrent Mark Sweep) 收集器是获取最短停顿时间为目标的垃圾收集器。它适合在非常注重用户体验的应用程序上使用。它也是HOTSPOT虚拟机第一款真正意义上的并发收集器。它第一次实现了用户线程和垃圾回收线程可以一起同时运行。

注意:CMS垃圾收集器是一款老年代的垃圾收集器

二、CMS收集的步骤

从CMS收集器的名字上我们就可以知道,它主要使用的垃圾收集算法是标记-清除(mark sweep)算法,它执行的整个过程主要涉及四个步骤:

1.初始标记

暂停所有的用户线程(STW),并标记下Gc Roots的直接引用对象,速度很快。

2.并发标记

根据初始标记阶段标记的Gc Roots的直接引用对象,向下扫描整个引用的对象图。并发标记阶段不需要暂停用户线程,用户线程和垃圾收集线程一起运行。因此在这个阶段会出现已经标记的对象的状态发生改变。这个阶段的耗时是整个垃圾回收阶段的80%。

3.重新标记

这个阶段主要解决的问题就是在并发标记阶段出现的被标记对象的状态发生改变的情况,主要是解决漏标的问题(使用三色标记中的增量更新来解决),这个阶段也是需要(STW),这个阶段的耗时比初始标记时间长,比并发标记执行时间短。

4.并发收集

在并发收集阶段主要是对未标记的区域进行垃圾清理。在并发收集阶段新生成的对象会直接标记成黑色(下面会再介绍三色标记)

下图是CMS收集器的具体执行流程图:
在这里插入图片描述


三、核心参数

CMS垃圾收集器的核心参数有很多,下面我来介绍几个核心的参数:

这些参数未必要记忆,但是在别人问到的时候,需要能说出来个大概,也不会有面试官那么变态让你把每个单词都拼出来。如果有的话,我们可以在心里开。。。。

注意这些参数都配置在idea中的 vm options中

  1. 开启CMS垃圾收集器 :-XX:+UseConcMarkSweepGC
  2. 配置垃圾收集的并发线程数:-XX:ConcGCThreads
  3. FullGC后需要压缩整理:-XX:+UseCMSCompactAtFullCollection
  4. 多少次FullGC后需要压缩整理:-XX:CMSFullGCsBeforeCompaction
  5. 当老年代使用比例达到多少后会触发Full GC(默认是92%):-XX:CMSInitiatingOccupancyFraction
  6. 只使用设置的回收阀值(-XX:CMSInitiatingOccupancyFraction),如果不设置的话,jvm会在第一次使用设定的值,后面自行会调整:-XX:+UseCMSInitiatingOccupancyOnly
  7. 在CMS进行垃圾收集前,进行一次minor GC,降低CMS标记阶段的开销。由于在年轻带中大多都是朝生夕死的对象,因此在年轻代的垃圾回收中就干掉了很多对象,可以降低在老年代标记的开销,cms进行标记的时间占了整个垃圾回收时间的80%。-XX:+CMSScavengeBeforeRemark
  8. 在初始标记阶段多线程执行,缩短STW:-XX:+CMSParallellnitialMarkEnabled
  9. 在重新标记阶段多线程执行,缩短STW:-XX:+CMSParallelRemarkEnabled

四、总结

CMS垃圾收集器的优点是:高并发,低停顿,是HotSpot虚拟机上第一款真正意义的高并发垃圾收集器。后面G1和ZGC垃圾收集器都是对CMS垃圾收集器的一种演变。学好CMS垃圾收集器才是根本。
所有的垃圾收集器都有缺点,cms垃圾收集器也不例外。它的缺点有:

  • cpu资源敏感(会和用户线程抢资源)
  • 无法处理浮动垃圾:(在并发标记和并发清理)阶段产生的新的垃圾,需要等到下一次GC再去处理。
  • 它回收过程中由于使用的是“标记-清除”算法,会产生大量的内存碎片,但是我们可以配置参数:-XX:+UseCMSCompactAtFullCollection,可以让JVM在标记-清除结束后再做整理。
  • 执行过程中的不确定性,这种场景发生的可能性很小,业界也称“concurrent mode failure” 并发模式失败:在进行并发收集和并发清理阶段还未结束,下一次full GC 又来执行了,这时就会STW,使用serial收集器来代替cms收集器继续去收集垃圾。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LeoZhuhui1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值