美文网首页
CMS 垃圾收集器 总结

CMS 垃圾收集器 总结

作者: 熙熙爸爸 | 来源:发表于2017-12-27 16:14 被阅读0次

CMS 垃圾收集器

这两天在网上看了不少关于JVM 垃圾回收的相关知识,大家总结的都很好,我也从中学到了很多,现在对其中的一些内容进行一下总结。

这篇文章先总结一下CMS垃圾回收器,把自己所理解的写出来,加深认识。
首先CMS 指的是 Concurrent Mark Sweep,并发标记清除。
这里虽然说得是并发,但是并不是整个过程都是并发的,在cms中仍然后两个阶段是需要stw的,只不过它把耗时的操作放到了并发的阶段中,使stw的时间很大程度的缩短了。

CMS的阶段有
1. 预标记阶段 (initial mark) stw
2. 并发标记
3. 并发预清理 (需要通过参数-XX:+CMSParallelRemarkEnabled来开启)
4. 重标记阶段  stw
5. 并发清理阶段
6. 重置阶段

预标记阶段

进行可达性分析,标记出GC Root直接饮用的对象

并发标记

进行GC Root tracing,和用户线程并发执行,由前一阶段标记处的对象出发,找出所有的可达对象

并发预处理

这个阶段可以通过配置来进行控制,这个阶段的作用和重标记类似,是为了把重标记的部分工作放到这里,减少重标记阶段的停顿时间。

PS

在进行可达性分析的过程中,可能会遇到两种特殊的情况 1.年轻带中的对象引用了老年代中的对象(比较常见)2.老年代中的对象引用了年轻代中的对象。
所以在对老年代进行回收的时候,也要对年轻代进行扫描。所以在这个操作中为了减少扫描年轻代的时间,会先对年轻代进行一次 minor gc(有参数控制XX:+CMSScavengeBeforeRemark)
在对年轻代进行gc的时候,如果也要对老年代进行扫描的话,那停顿的时间就会非常长了。在这里jvm有一个CardTable的数据结构可以高效的实现这种操作。

为了支持高频率的新生代的回收,虚拟机使用一种叫做卡表(Card Table)的数据结构,卡表作为一个比特位的集合,每一个比特位可以用来表示年老代的某一区域中的所有对象是否持有新生代对象的引用。
这样新生代在GC时,可以不用花大量的时间扫描所有年老代对象,来确定每一个对象的引用关系,而可以先扫描卡表,只有卡表的标记位为1时,才需要扫描给定区域的年老代对象。而卡表位为0的所在区域的年老代对象,一定不包含有对新生代的引用。

所以在进行老年代gc的时候通常也会进行minor gc

相关文章

  • 垃圾收集器总结

    垃圾收集器总结 各种收集器组合使用的参数 Serial + CMS 注意不能使用-XX:+UseConcMarkS...

  • Java 垃圾收集器

    1、CMS收集器 CMS收集器是老年代垃圾收集器,可以与Serial收集器、Parallel New收集器搭配使用...

  • CMS收集器

    理解CMS收集器 CMS收集器在新生代垃圾回收时,所有应用线程都会暂停 CMS收集器在老年代的垃圾处理上启动一个并...

  • JVM-GC(2)

    JVM-GC(2) 垃圾收集器 CMS收集器 CMS收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器...

  • CMS垃圾收集器——重新标记的讨论

    《深入理解java虚拟机 第二版 JVM高级特性与最佳实践》里面提到CMS垃圾收集器。 CMS垃圾收集器的垃圾回收...

  • 2.JVM系列-CMS垃圾收集器

    目录 一.背景 二.CMS垃圾收集器特性 三.CMS执行步骤 四.CMS日志解释(JDK1.8): 五.CMS参数...

  • 四、常见垃圾收集器

    一、垃圾收集器组合图 二、垃圾收集器的发展史 单核时代 - 串行垃圾收集器 多核时代 - 小内存1)CMS是老年代...

  • 22-大厂面试题:Con-current Mode Failur

    上文我们已经介绍了CMS垃圾收集器的工作原理以及流程,本篇我们接着深入说明CMS垃圾收集器的缺点以及所导致的一些问...

  • java CMS垃圾回收日志

    文章目录一、CMS垃圾回收器介绍二、CMS JVM运行参数三、CMS收集器运行过程1、初始标记(CMS initi...

  • 1 垃圾收集器

    垃圾收集器 Serial、Serial Old、PawNew、CMS、Parallel Scavenge、Para...

网友评论

      本文标题:CMS 垃圾收集器 总结

      本文链接:https://www.haomeiwen.com/subject/muazyxtx.html