what:
CMS全称Concurrent marke sweep,中⽂是并发标记清除算法。 CMS出现的⽬的是:尽可能的减少STW(stop the world)的时间。
⼤体流程:
注意:“预清理”和“可终⽌清理”没有标记出来 how:
CMS⼯作分7步,分别是: 1、初始标记;
STW的⽅式⼯作。标记出根对象(GC root直接引⽤的对象),从线程栈、静态区(⽅法区的静态属性引⽤对象、⽅法区的常量引⽤对象)、本地⽅法栈的JNI引⽤的对象。
包含2部分:a、⽼年代中全部的GC root对象,如下图的1结点;b、年轻代中活着的对象,它们所引⽤到的⽼年代中的对象,如下图的节点2、3
2、并⾏标记;
以“初始标记”的对象集为起点,并⾏的找到所有存活的对象;由于该阶段是和⽤户线程同时进⾏的,所以对象之间的引⽤关系会发⽣改变(如:新⽣代升到⽼年代、⽼年代中的对象引⽤关系变化等)。如果不进⾏后续处理,会出现“漏标”的情况。即有了后⾯的“重新标记”步骤。
为了提⾼“重新标记”的效率,会将“并⾏标记”阶段变化的对象所在的card标记为dirty,后续只扫描标记为dirty的card。 该阶段会增加2个节点4和5。
3、预清理;
由于“并发标记”阶段,并不能标记所有存活的对象(原因是:并⾏)。在该阶段会扫描所有dirty的card。如下图:“并发标记”阶段,
节点3的引⽤关系发⽣了变化,所有节点3所在的card会被标记成dirty。
扫描后,6节点会被标记上,如下图;
4、可终⽌预清理;
该阶段主要是为下阶段的⼯作铺垫,尽量承担⼀部分下阶段的⼯作,该阶段持续的事件依赖很多因素,例如:重复次数、持续⼯作时间登。
⽬的是:期待在该阶段中发⽣异常YGC,从⽽减少下个阶段扫描新⽣代对⽼年代引⽤的时间。 5、重新标记;
⽬的:标记⽼年代中所有存活的对象。
本阶段标记的范围是:整个堆,包含young和old代。为何扫描young代?old代中的对象只要是被young代中的对象引⽤了,就算是活的。即使young中的对象是不可达,也会⽤来做gc root扫描old代。
在第2到第4阶段,都是和⽤户线程并⾏的,young代中对old代中的对象引⽤关系发⽣了变化,所以remark要化很长时间来STW做标记。则CMS会尽量在做final remark时,young代是⾜够⼲净的。
可以加⼊参数-XX:+CMSScavengeBeforeRemark,在重新标记之前,先执⾏⼀次ygc。 6、并发清理
此阶段是:完成前5阶段标记后剩下的垃圾对象。
在此阶段的时间内,⽤户新产⽣的垃圾,就只能等到下个阶段在清理了。 7、并发重置;
重置CMS内部的数据结构,准备给下个阶段的CMS使⽤。 注意:
1、减少final remark的时间:
⼀般CMS的80%时间来⾃“final remark”,如果发现该阶段的时间⽐较长,可以考虑使⽤如下参数: -XX:+CMSScavengeBeforeRemark
2、内存碎⽚:
CMS是基于“标记-清理”原理来做的。
⼀般通过:CMSFullGCsBeforeCompaction来设计压缩的。CMSFullGCsBeforeCompaction默认是0。
3、concurrent mode failure
CMS除了“初始标记”和“重新标记”2个阶段会STW,其他阶段都是和⽤户进程并发的。就会出现:⽤户线程向⽼年代不断提交新的对象,但是⽼年代还没来得及腾出空间,⽼年代空间满了,就出现了concurrent mode failure。
可以通过调整:-XX:CMSInitiatingOccupancyFraction和-XX:+UseCMSInitiatingOccupancyOnly。⼆者关系:如果不设置UseCMSInitiatingOccupancyOnly,只设置XX:CMSInitiatingOccupancyFraction。那么JVM只会第⼀次使⽤
XX:CMSInitiatingOccupancyFraction,后⾯会⾃动调整XX:CMSInitiatingOccupancyFraction,从⽽导致设置的不在有效。
注意:如果XX:CMSInitiatingOccupancyFraction设置⼤了会fullGC,⼩了会频繁cms gc,那就说明⽼年代的空间⼩了(需要增⼤)。 危害:“concurrent mode failure”会导致fullGC变成Serial Old收集器,它是单线程的标记-压缩收集器,所以耗时⾮常的长。如下⾯的例⼦:
4、promotion failed
发⽣在年轻代回收。⼀般是:Minor GC时,Survivor Space放不下,对象只能放⼊⽼年代,⽽此时⽼年代也放不下造成的。 解决⽅案:a、增⼤Survivor空间;b、减少对象的⼤⼩;
因篇幅问题不能全部显示,请点此查看更多更全内容