深入浅出CMS垃圾收集器
听说微信搜索《Java鱼仔》会变更强哦!
本文收录于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垃圾回收器的缺点也比较明显:
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不管对工作还是面试都是有很大帮助的,我是鱼仔,我们下期再见!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
软件测试:通过jmeter完成对请求字段的加密
前言 相信大家在工作中做接口测试的时候,肯定会遇到一个场景,那就是你们的软件,密码是加密存储的。。 那么这样的话,我们在执行接口的时候,对于密码的处理就开始头疼了。。 所以,本文将使用 jmeter 这款 Java 开源的接口测试工具,给大家来讲解 jmeter 完成加密的接口请求 先导知识 在执行加密之前,你需要了解 3 个知识点: 元件-> 前置/后置处理器 beanshell 是什么 beanshell 的内置变量 元件-> 前置/后置处理器 前置处理器:此元件突出一个“前”,所以它是在请求发出之前的一个处理器 后置处理器:此元件突出一个“后”,所以它是在请求发出之后,得到了响应结果后的一个处理器 beanshell 是什么 BeanShell 是一种完全符合 Java 语法规范的脚本语言,并且又拥有自己的一些语法和方法。 BeanShell 是可以执行标准 Java 语句和表达式,另外包括一些脚本命令和语法。 简单的来说,我们可以在 beanshell 里写 Java 代码,然后 jmeter 会去执行这些代码 beanshell 内置变量 vars:本质上来说。它...
-
下一篇
容器化 | ClickHouse on K8s 基础篇
作者:苏厚镇 青云科技数据库研发工程师 目前从事 RadonDB ClickHouse 相关工作,热衷于研究数据库内核。 ClickHouse[1] 是一款用于联机分析(OLAP)的列式数据库管理系统(DBMS)。由号称“俄罗斯 Google”的 Yandex 公司开发,并于 2016 年开源,近年在计算引擎技术领域受到越来越多的关注,算是数据库后起之秀。 Kubernetes[2] 是 Google 公司于 2014 年 6 月开源的一款容器集群管理系统。适用于管理云平台多个主机的容器化应用,旨在让部署容器化的应用简单并且高效,努力成为跨主机集群的自动部署、扩展以及运行应用程序容器的平台。 借助 K8s 和容器化技术,我们不仅可以使得应用的部署和管理更加简单高效、提高硬件资源利用率等,还可以实现健康检查和自修复、自动扩缩容、负载均衡等高级功能。 那么,如果黑马数据库 ClickHouse 遇上火热的容器化管理技术 K8s,会擦出怎样的火花呢? | ClickHouse 容器化方案概览 当前 ClickHouse 的主流容器化方案包括 原生(Kubectl)部署 和 Helm 部署 两...
相关文章
文章评论
共有0条评论来说两句吧...