CMS垃圾收集器详解(转载)
文章目录
- 概念
- CMS的GC过程
- 初始标记
- 并发标记
- 并发预处理
- 重新标记
- 并发清除
- CMS的缺点
- 总结:
概念
CMS全称为Concurrent Mark Sweep,即 并发标记清除,对比其他的收集器,最大的区别在于并发:在GC线程工作的时候,用户线程不会完全停止,用户线程在部分场景下与GC线程一起并发执行。但是,无论是什么垃圾收集器,Stop the world是一定无法避免的。CMS只是在部分的GC场景下可以让GC线程与用户线程并发执行。
CMS的涉及目的是为了避免【老年代GC】出现长时间的卡顿(stop the word)。
CMS的GC过程
CMS主要是实现了标记清除垃圾回收算法,可分为5个步骤:
- 初始标记(STW)
- 并发标记
- 并发预清理
- 重新标记(STW)
- 并发清除
详细GC步骤如下:
初始标记
初始标记会标记GCRoots直接关联的对象以及年轻代指向老年代的对象,初始标记这个过程会发生Stop the word。但是这个阶段的速度很快,因为没有向下追溯,即只标记一层。
并发标记
这个过程不会停止用户线程(即不会发生stop the world),这一阶段主要是GC Roots向下追溯,标记所有可达的对象,该阶段比较耗时,因为需要追溯。
并发预处理
这个阶段主要目的就是【减少下一阶段重新标记所消耗的时间】,因为下一阶段重新标记需要Stop the World.
并发标记阶段由于用户线程是没有被挂起的,所以对象有可能是发生变化的。可能有些对象,从新生代晋升到了老年代;可能有些对象,直接被分配到了老年代(大对象)。可能老年代或者新生代的对象引用发生了变化…
解决该问题就是——针对老年代的对象,可以借助类card table的存储,将老年代对象发生变化所对应的卡页标记为dirty。
所以并发预处理这个阶段会扫描可能由于并发标记时导致老年代发生变化的对象,会再扫描一边标记为dirty的卡页。
对于新生代的对象,还需要遍历新生代在并发标记过程中有没有对象引用了老年代。JVM提供了很多参数,可能在这个过程中触发一次minor GC(触发GC意味着可以更少地遍历新生代的对象)
重新标记
标记那些在并发标记阶段发生变化的对象,该阶段你会Stop the world,这里停顿的时间很大程度上取决于并发预处理阶段
并发清除
该阶段不会发生stop the world,用户线程一边执行,GC线程一边在回收不可达对象。
注意:这个过程可能存在用户线程在不断产生垃圾,但也只能留到下一次GC进行处理,这些垃圾又称为"浮动垃圾"。
全部结束后会重置CMS算法相关的内部数据,为下一次GC循环做准备。
以上就是CMS回收垃圾的过程,其实就是把垃圾回收的过程给细分了,然后再某些阶段可以不停止用户线程,一边回收垃圾,一边处理请求,来减少每次垃圾回收时stop the word的时间。当然,中间也做了很多的优化,比如dirty card标记,中途触发minor GC等等
CMS的缺点
空间需要预留:CMS垃圾收集器可以一边回收垃圾,一边处理用户线程,那需要在这个过程中保证有充足的内存空间供用户使用。如果CMS运行过程中预留的空间不够用,会报错,这时会启动Serial Old垃圾收集器进行老年代的垃圾回收,会导致停顿的时间很长。
内存碎片问题:CMS本质上是实现了标记清除算法的收集器,这意味着会产生内存碎片,由于碎片太多,又可能导致内存空间不足所触发full GC,CMS一般会触发full GC这个过程堆碎片进行整理。整理涉及到【移动】和【标记】,这个过程肯定会stop the world,如果内存足够大,这个过程卡顿也需要一定的时间。
综合来看,使用CMS的弊端好像一个死循环:
内存碎片过多,导致空间利用率降低,空间本身就需要预留给用于线程使用,现在碎片化又加剧了空间的问题,可能导致垃圾收集器降级为Serial Old,卡顿时间更长;要处理内存碎片问题,同样会卡顿。
所以,目前企业中一般都使用G1。
总结:
CMS垃圾回收器设计目的:为了避免「老年代 GC」出现「长时间」的卡顿(Stop The World)
CMS垃圾回收器回收过程:初始标记、并发标记、并发预处理、重新标记和并发清除。初始标记以及重新标记这两个阶段会Stop The World
CMS垃圾回收器的弊端:会产生内存碎片&&需要空间预留:停顿时间是不可预知的
CMS垃圾收集器详解(转载)相关推荐
- CMS垃圾收集器详解
概述 CMS垃圾收集器是一款优秀的老年代并发垃圾收集器,通过与用户线程并发执行的方式减少GC停顿的时间.本文主要聊一下CMS设计到的相关的数据结构.具体的执行过程.运行中会出现的异常情况. 在CMS之 ...
- GC之7大垃圾收集器详解(下)
GC之7大垃圾收集器详解 目录 GC之CMS收集器 GC之SerialOld收集器 GC之如何选择垃圾收集器 GC之G1收集器 第一部分请参见: GC之7大垃圾收集器详解(上) 6. GC之CMS收集 ...
- GC之7大垃圾收集器详解(上)
GC之7大垃圾收集器详解 目录 GC之7大垃圾收集器概述 GC之Serial收集器 GC之ParNew收集器 GC之Parallel收集器 GC之ParallelOld收集器 GC之CMS收集器 GC ...
- G1 垃圾收集器详解
Garbage First(简称G1)收集器开创了收集器面向局部收集的设计思路和基于Region的内存布局形式.它是一款专门针对于拥有多核处理器和大内存的机器的收集器,在满足了GC响应时间的延迟可控的 ...
- CMS、G1垃圾收集器详解
CMS垃圾收集器 基本上只能用在老年代,很长一段时间是ParNew(新生代)搭配CMS(老年代)来使用的. 收集过程大概会分为如下4个过程: 1.初始标记: 暂停所有的其他线程,并记录下gc root ...
- JVM垃圾收集器详解 CMS、G1、Shenandoah、ZGC
上一篇我们讲解了一些垃圾回收的理论和一些基础的算法和思想,这一篇主要是jvm从古至今垃圾收集器的实现. 各垃圾回收器 注:有连线的代表他们可以互相配合使用. Serial和Serial Old收集器 ...
- (七)Java垃圾收集器详解
面试官问:Java垃圾收集器了解过多少,说一下 JVM 有哪些垃圾回收器?这些问题在你面试高级Java的时候经常会问到.本篇文章结合着[深入理解Java虚拟机]一书当中整理了本篇博客. 如果想要对收集 ...
- java 垃圾收集器_JVM垃圾收集器详解
说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态 ...
- 深入理解Java虚拟机——JVM垃圾回收机制和垃圾收集器详解
一:概述 说起垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,顾名思义,垃圾回收就是释 ...
最新文章
- 矛与盾:二进制漏洞攻防思想对抗
- list vue 删除后页面渲染_浅谈Vue项目实战(页面渲染+事件绑定)
- 使用循环语句判定用户账号密码输入三次是否正确
- php论坛怎么架设,论坛架设有诀窍 phpWind配置技巧三则
- 传递函数尾1法和首1法及具体举例+H(s)与H(z)在书中出现的目的
- 定时任务重启后执行策略_C语言操作时间函数time.ctime,实现定时执行某个任务小例子...
- Linux进阶之路————组管理与权限管理
- nw.js 打包换桌面图标_我如何使用CometChat和NW.js构建桌面聊天应用程序(以及方法)
- 概率编程语言(Probabilistic Programming Languages)库 —— edward
- Shell 把日志记录按天切割到不同的文件
- 怎样找回xp调整分区后盘符不见的文件
- 怎么查二手华为手机价格
- 汉王考勤管理系统使用教程
- TensorFlow手册链接
- xbee模块和单片机_XBee与ZigBee模块区别
- yarn集群下启动spark错误WARN:66 - Neither spark.yarn.jars nor spark.yarn.archive is set
- DRAG DROP
- 安装Memcached及Memcached配置
- Ubuntu常见命令
- MCNP运算及代码基础结构和可视化软件VISED的使用
热门文章
- 备份程序 bacula和bacula-api 安装
- 国家版权局通报“剑网2018”成果:查处侵权案件544件
- Playfair密码(原理+代码)
- android+圆角屏幕方法,android屏幕圆角实现方法的示例代码
- linux bash shell:最方便的字符串大小写转换(lowercase/uppercase conversion)
- 英特尔官方发布Atom N435芯片
- 美国哈佛大学图书馆凌晨4点座无虚席 (转载)
- MySQL主从复制高级进阶
- 推荐几款装机必装的软件
- 深脑链解决人工智能全行业痛点的公链