深入浅出CMS垃圾收集器

深入浅出CMS垃圾收集器如果说 JDK1 8 是最常用的线上版本 那么 CMS 垃圾回收器就是最常用的老年代垃圾回收器

本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看

(一)CMS垃圾收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的老年代收集器。CMS是基于标记-清除算法的老年代垃圾回收器,CMS是目前应用最广泛的老年代垃圾回收器。

CMS的使用只需要在JVM的启动参数中增加(-XX:+UseConcMarkSweepGC)参数即可激活使用CMS垃圾收集器。

CMS基于“标记-清除”算法实现,是HotSpot虚拟机的第一款真正意义上的并发收集器,基本上实现了垃圾收集线程与用户线程同时工作。

(二)CMS垃圾收集器的步骤

CMS的运行过程主要分为四个阶段:

1、初始标记:标记GC Roots可以直接关联到的对象,速度很快(stop the world)

2、并发标记:根搜索算法的过程

3、重新标记:为了修正并发标记期间,因程序运行导致标记产生变动的对象。(stop the world)

4、并发清除:清除垃圾

我画了一个图更加形象地展示上面四个流程,红色表示CMS线程,黄色表示应用线程

深入浅出CMS垃圾收集器

(三)CMS垃圾收集器的优缺点

CMS垃圾收集器的主要有点为并发收集、并发清除、低停顿。相比较前几代的垃圾收集器,CMS垃圾收集器给用户的体验更好,因为它追求的是最短的回收停顿时间。

CMS垃圾回收器的缺点也比较明显:

1、对CPU资源十分敏感,因为并发标记和并发清除都是和程序同时运行,因此会占用CPU导致应用程序变慢。

2、无法处理浮动垃圾,浮动垃圾就是在并发清除过程中新生成的垃圾,这部分垃圾CMS无法在本次被清理,可能出现Concurrent Mode Failed报错,因此需要预留一定的内存空间,无法等到老年代快被占满时再清除。默认情况下,CMS在老年代使用了92%后就会被激活。可以设置-XX:CMSInitiatingOccupancyFraction设置这个值。

如果真的出现了concurrent mode failed,说明已经没办法并发标记垃圾了,这时候就会使用serial old垃圾收集器来回收,也就是通过stop the world的方式。

3、产生空间碎片,由于采用的是标记-清除算法,那就无法避免会产生空间碎片的问题,这会给分配大对象带来困难。

(四)CMS的相关参数

我把常用的几个参数列了出来,每个参数表示什么意思也都写在了最后:

1-XX:+UseConcMarkSweepGC #启动CMS 2-XX:ConcGCThreads #CMS并发线程数量 3-XX:+UseCMSCompactAtFullCollection #FullGC之后做压缩,减少碎片 4-XX:CMSFullGCsBeforeCompaction #多少次FullGC之后压缩一次碎片,默认0,表示每次FullGC后都会压缩 5-XX:CMSInitiatingOccupancyFraction #老年代使用多少后会触发FullGC,默认92 6-XX:+UseCMSInitiatingOccupancyOnly #固定使用CMSInitiatingOccupancyFraction设置的参数, 如果不设置该参数,CMSInitiatingOccupancyFraction设置的比例只会在第一次GC时使用,后续会自动优化 7-XX:+CMSScavengeBeforeRemark #在CMS GC之前触发一次minor gc,降低CMSGC标记阶段的开销 8-XX:+CMSClassUnloadingEnabled CMS收集器默认不会对永久代进行垃圾回收。如果希望对永久代进行垃圾回收,可用设置标志 

以上参数在使用时根据业务的需要以及机器配置等进行综合考虑后设置。

我这里给出一个微服务架构下线上单个服务的JVM参数,参数设置仅供参考,不同的业务场景下设置都不同。:

-Xmx4096m -Xms4096m -Xmn2048M -XX:HeapDumpPath=/home/admin/logs/java.hprof -XX:+HeapDumpOnOutOfMemoryError -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSClassUnloadingEnabled -Xloggc:/home/admin/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps 

(五)总结

首先用一句话总结CMS垃圾收集器:以获取最短回收停顿时间为目标的老年代收集器,收集过程主要分为初始标记、并发标记、重新标记、并发清除四个阶段,缺点是对CPU资源十分敏感、无法处理浮动垃圾、产生空间碎片

如果说JDK1.8是最常用的线上版本,那么CMS垃圾回收器就是最常用的老年代垃圾回收器。因此知道CMS不管对工作还是面试都是有很大帮助的,我是鱼仔,我们下期再见!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233530.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 教你如何免费使用云服务器「建议收藏」

    教你如何免费使用云服务器「建议收藏」深度学习没有GPU?!!教你如何白嫖服务器一、声明二、引言二、如何获取三、操作步骤3.1文件传输软件的安装3.3远程操控软件的安装四、资料软件分享五、总结教你如何白嫖服务器)一、声明本文章没有广告用意,只是觉得好用分享给大家。同时做个简单的记录。二、引言因为电脑只有CPU,算力不够,以及很多深度学习教程以及模型都是在GPU环境下进行,所以一直想着怎么样才能白嫖到服务器,毕竟云服务器不便宜,要是经常用的话,对学生党来说是一笔不小的支出。有一天经过群友推荐终于找到了一个可以免费试用200元的云服

    2022年9月26日
    1
  • 用WAP手机远程遥控电脑

    用WAP手机远程遥控电脑

    2021年7月31日
    63
  • 【经典算法大全】收集51种经典算法 初学者必备

    【经典算法大全】收集51种经典算法 初学者必备《经典算法大全》是一款IOS平台的应用。里面收录了51种常用算法,都是一些基础问题。博主觊觎了好久,可悲哀的是博主没有苹果,所以从网上下了老奔的整理版并且每个都手敲了一遍。虽然网上也有博客贴了出来,但是自己写写感觉总是好的。现在分享个大家。代码和运行结果难免有出错的地方,请大家多多包涵。 1.河内之塔(汉诺塔)2.费式数列3.巴斯卡三角形4.三色棋5.老鼠走迷宫(1

    2022年5月29日
    29
  • 代码实现二叉树的三种遍历_遍历二叉树口诀

    代码实现二叉树的三种遍历_遍历二叉树口诀文章目录一、图示理解(图片是一位前辈所留,在此感谢)1、先序遍历2、中序遍历3、后序遍历4、层序遍历二、深入理解三种遍历让我们来理解一下绕着外围跑一整圈的真正含义是:遍历所有结点时,都先往左孩子走,再往右孩子走。下面做一个实例吧三、代码实现加以理解以下是C语言全部代码实现下面是同样的例子用c++实现,大家可以参考一下一、图示理解(图片是一位前辈所留,在此感谢)1、先序遍历先序遍历可以想象成,…

    2022年8月18日
    5
  • 菜鸟看源码之ArrayDeque

    菜鸟看源码之ArrayDeque先扯点别的:今天上海风不小,现在窗外依然是狂风呜咽,不禁让人想起山科的风。今天分析一下ArrayDeque的源码ArrayDeque的继承关系图ArrayDeque实现了Deque接口,内部使用一个可调整大小的数组来存放元素。数组没有容量限制,必要的时候数组的容量会增加。ArrayDeque不是线程安全的。不允许添加Null元素。当ArrayDeque作为一个栈来使用的时候,Ar…

    2022年9月19日
    5
  • python代码情话_python怎么运行代码

    python代码情话_python怎么运行代码做微信聊天机器人,实现步骤:1.获取微信的使用权,即python脚本能控制微信收发信息。2.python脚本收到聊天信息后,要对该信息进行处理,返回机器人的回应信息。我这里有一套Python从入门到精通的全套资料免费送给大家,但是要加我的Python学习Q群:808713721才可以免费领取,因为我在里面会私发给大家。简易版代码fromwxpyimport*#apikey在http://www.t…

    2025年12月7日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号