CMS 垃圾回收算法总结

并发标记清除(CMS)垃圾回收算法

垃圾回收的四个主要阶段

  1. 初始标记
    初识标记:这个过程是标记从gc root出发发的直接相关的引用。这个时间很短,但是是stop the world;
  2. 并发标记
    并发标记:用户线程并行执行,进行相关的引用标记。这个时间很长,一般决定于堆内存的大小。所使用的线程数为(cpu个数+3)/4,所以当cpu核数很少时,在并发标记阶段会出现严重的性能下降。为了解决这个问题,对于cpu核数很少时,在并发标记阶段会与用户线程交叉执行,以使服务器性能不至于下降的太严重。但是这样操作会使标记过程所耗费的时间更长。
  3. 重新标记
    重新标记:因为在并发标记时,用户线程在执行,可能会造成再次的实例引用。所以需要重新标记一下。这个阶段的标记也是stop the world,并且是并行标记。

  4. 并发清除
    并发清除,即清除相关的垃圾。

CMS的缺点

由于CMS使用的是标记清除算法,会造成内存碎片,当老年代无法再次分配内存时需要FULL GC。CMS提供了一个参数-XX+UseCMSCompactAtFullCollection,即在执行FULL GC时开启内存碎片的合并整理过程。这也会引起stop the world。

CMS在进行垃圾回收时,无法处理浮动垃圾。所以在进行垃圾回收时,需要留有一定的内存供用户线程使用。CMS提供了一个内存触发垃圾回收的内存使用比例:
-XX:CMSInitiatingOccupancyFraction,如果预留的内存不够使用,就会出现Cocurrent Mode Failure失败,这时就需要启动后备预案:临时使用串行收集器重新进行老年代的垃圾收回,这个时间更长。
CMS 用来进行老年代的垃圾回收,这个与ParNew(多线程的串行垃圾回收)进行组合,用于整个的堆内存的垃圾回收。

参考:深入理解 Java虚拟机

猜你喜欢

转载自blog.csdn.net/zhurhyme/article/details/78301061
今日推荐