当前位置: 首页 > news >正文

深入浅出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垃圾回收器的缺点也比较明显:

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不管对工作还是面试都是有很大帮助的,我是鱼仔,我们下期再见!

相关文章:

  • php.ini中的session配置说明
  • 如何上传自己的jar包到maven中央仓库(2021最新版)
  • ElasticSearch聚合查询Restful语法和JavaApi详解(基于ES7.6)
  • 《偷影子的人》
  • 模板方法设计模式理论与应用
  • 跟我一起数据挖掘(13)——矩阵分解
  • 用了MybatisPlus后,我很久没有手写sql了
  • 两张图让你快速读懂JVM字节码指令
  • Android Bitmap面面观
  • 用几张图深度剖析Java运行时数据区
  • HDOJ(HDU) 2519 新生晚会(组合公式)
  • 从JVM角度思考--如何预估线上环境机器资源大小
  • 1到3年的Java开发工程师应该如何准备面试
  • 写了两年代码之后再来看看Spring中的Bean
  • 【Python之旅】第二篇(四):字典
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • canvas 五子棋游戏
  • CSS盒模型深入
  • es的写入过程
  • Git的一些常用操作
  • HTTP请求重发
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spark学习笔记之相关记录
  • Vue实战(四)登录/注册页的实现
  • 编写符合Python风格的对象
  • 代理模式
  • 读懂package.json -- 依赖管理
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 力扣(LeetCode)56
  • 如何在GitHub上创建个人博客
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 小李飞刀:SQL题目刷起来!
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 如何用纯 CSS 创作一个货车 loader
  • ​secrets --- 生成管理密码的安全随机数​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $$$$GB2312-80区位编码表$$$$
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (4)Elastix图像配准:3D图像
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (java)关于Thread的挂起和恢复
  • (SpringBoot)第七章:SpringBoot日志文件
  • (第61天)多租户架构(CDB/PDB)
  • (分布式缓存)Redis分片集群
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (理论篇)httpmoudle和httphandler一览
  • (三)docker:Dockerfile构建容器运行jar包
  • (三)elasticsearch 源码之启动流程分析
  • (四)c52学习之旅-流水LED灯
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • .md即markdown文件的基本常用编写语法
  • .NET BackgroundWorker