深入浅出CMS垃圾收集器

简介: CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的老年代收集器。CMS是基于标记-清除算法的老年代垃圾回收器,CMS是目前应用最广泛的老年代垃圾回收器。CMS的使用只需要在JVM的启动参数中增加(-XX:+UseConcMarkSweepGC)参数即可激活使用CMS垃圾收集器。CMS基于“标记-清除”算法实现,是HotSpot虚拟机的第一款真正意义上的并发收集器,基本上实现了垃圾收集线程与用户线程同时工作。

网络异常,图片无法展示
|


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

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


我这里给出一个微服务架构下线上单个服务的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不管对工作还是面试都是有很大帮助的,我是鱼仔,我们下期再见!



相关文章
|
7月前
|
消息中间件 算法 Java
jvm性能调优 - 14JVM的老年代垃圾回收器CMS原理
jvm性能调优 - 14JVM的老年代垃圾回收器CMS原理
92 0
|
7月前
|
算法 Java
jvm性能调优 - 15JVM的老年代垃圾回收器CMS的缺点
jvm性能调优 - 15JVM的老年代垃圾回收器CMS的缺点
129 0
|
数据采集 监控 算法
深入理解JVM系列教程(07) - 垃圾收集器
深入理解JVM系列教程(07) - 垃圾收集器
85 0
|
2月前
|
算法 架构师 Java
深入理解HotSpot源码:CMS、C1与ZGC的区别
【10月更文挑战第8天】作为一名资深架构师,深入理解HotSpot虚拟机中的垃圾收集器CMS、编译器C1以及新一代垃圾收集器ZGC,对于构建高效、可靠的Java应用至关重要。本文将通过背景介绍、业务场景分析、功能点阐述及Java源码示例,带您深入探讨这三者的区别。
62 2
|
7月前
|
存储 算法 Java
深入浅出JVM(十七)之并发垃圾收集器CMS
深入浅出JVM(十七)之并发垃圾收集器CMS
|
缓存 算法 Java
JVM CMS GC算法解析
JVM CMS GC算法解析
88 0
|
算法 Java
21-看懂CMS收集器工作机制
年轻代垃圾回收器机制我们都很清楚了,接下来我们介绍最核心的老年代垃圾回收环节。
133 0
21-看懂CMS收集器工作机制
|
算法 Java UED
深入解析CMS垃圾回收器
在CMS之前的垃圾回收器,要么就是串行垃圾回收方式,要么就是关注系统吞吐量,而 CMS 垃圾回收器的出现,则打破了这个尴尬的局面。
346 0
深入解析CMS垃圾回收器
|
算法 Java 测试技术
CMS GC已成过去式
CMS,全称“ Concurrent-Mark-Sweep”,是一款并发的、使用标记-清除算法的垃圾回收器,如果老年代采用CMS垃圾回收器,则需要在应用服务Java虚拟机启动参数中配置关键字:-"XX:+UseConcMarkSweepGC"。
113 0