CMS垃圾回收器——三色标记算法

CMS(current Mark Sweep):顾名思义,这是一个并发,标记、清除的垃圾回收器,适用于老年代垃圾回收。
在jdk1.8中和新生代的ParNew垃圾回收器搭配使用。

CMS垃圾回收器主要过程

在这里插入图片描述
整个过程可以大致分为五个步骤,其中只有初试标记和重新标记需要STW,其他步骤都可以并发执行,可以看出这是一款追求最小停顿时间的垃圾回收器。

concurrent mode failure

并发标记和并发标记处理阶段,如果又触发full GC,会导致出现“concurrent mode failure”,这时会STW并且使用Serial old 垃圾收集器收集,要避免出现这种情况

初始标记

标记GCRoot可以直接引用的对象,不再进行深层次扫描,所以速度很快,STW时间很短。

并发标记

在初始标记的基础上对整个堆中的对象进行逐层扫描,耗时较长,但是因为是和用户程序并发执行,并不影响用户体验。
但是并发标记的过程都会有个问题,和应用程序一起执行,应用程序的状态会发生变化,**可能存在漏标和多标的情况存在,**漏标的问题可以通过重新标记解决,多标的问题会产生“浮动垃圾”,下一次GC时再解决。

重新标记

重新标记的过程可以解决并发标记过程中的漏标问题。主要是通过三色标记的增量更新方法来处理的。
三色:黑色、灰色和白色
**黑色:**对象已经被垃圾收集器扫描过,并且这个对象的所有引用都已经扫描过了,所以它不可能指向白色对象;
**灰色:**对象已经被垃圾收集器扫描过了,但是对象中还存在没有扫描的引用;
**白色:**表示对象没有被垃圾收集器访问过,即表示不可达。

增量更新

这里的增量指的就是我们在并发标记过程中(三色标记之后)一些新的引用的变化情况。

写屏障

漏标的原因是并发过程中引用的改变,C++实现垃圾回收器的时候,通过写屏障将变化的对象引用放入一个队列中,并最终放到一个集合中,然后再重新标记阶段进行再次扫描,因为重新标记是STW的,所以可以准确标记,解决漏标问题。

CMS主要参数

-XX:UseCMSCOmpactAtFullCOlletion:FullGC之后进行压缩整理,减少碎片
-XX:CMSFullGcsBeforeCompaction:多少次FullGc之后压缩一次,默认是0,每次都压缩
-XX:CMSInitialOccupancyFraction:
-xx:UseCMSInitialOccupancyOnly:
两个参数表示当老年代达到指定参数时,出发FullGc

你可能感兴趣的:(java)