`

Java之CMS GC的7个阶段

阅读更多

CMS收集器的主要设计目标是:低应用停顿时间。它通过两种方式实现这一目标:

  1. 不压缩老年代,而是使用空闲列表来管理回收空间。
  2. 大部分标记清理工作与应用程序并发执行。

主要问题:由于不压缩带来的老年代堆碎片,或者在对象分配率高的情况下,都可能导致Full GC。

CMS收集器的GC周期主要由7个阶段组成,其中有两个阶段会发生stop-the-world,其他阶段都是并发执行的。(亦有4个阶段、6个阶段等说法)

Phase 1: Initial Mark(初始化标记)

初始化标记阶段,是CMS GC的第一个阶段,也是标记阶段的开始。主要工作是标记可直达的存活对象

主要标记过程

  • 从GC Roots遍历可直达的老年代对象;
  • 遍历被新生代存活对象所引用的老年代对象。

程序执行情况

  • 支持单线程或并行标记。
  • 发生stop-the-world,暂停所有应用线程。



 

(Marked obj:老年代绿色圆点表示被初始化标记的对象。)

Phase 2: Concurrent Mark(并发标记)

并发标记阶段,是CMS GC的第二个阶段。

在该阶段,GC线程和应用线程将并发执行。也就是说,在第一个阶段(Initial Mark)被暂停的应用线程将恢复运行。

并发标记阶段的主要工作是,通过遍历第一个阶段(Initial Mark)标记出来的存活对象,继续递归遍历老年代,并标记可直接或间接到达的所有老年代存活对象



 

(Current obj:该对象的引用关系发生变化,对下一个对象的引用被删除。)

由于在并发标记阶段,应用线程和GC线程是并发执行的,因此可能产生新的对象或对象关系发生变化,例如:

  • 新生代的对象晋升到老年代;
  • 直接在老年代分配对象;
  • 老年代对象的引用关系发生变更;
  • 等等。

对于这些对象,需要重新标记以防止被遗漏。为了提高重新标记的效率,本阶段会把这些发生变化的对象所在的Card标识为Dirty,这样后续就只需要扫描这些Dirty Card的对象,从而避免扫描整个老年代。

Phase 3: Concurrent Preclean(并发预清理)

在并发预清洗阶段,将会重新扫描前一个阶段标记的Dirty对象,并标记被Dirty对象直接或间接引用的对象,然后清除Card标识

标记被Dirty对象直接或间接引用的对象:



 

清除Dirty对象的Card标识:



 

Phase 4: Concurrent Abortable Preclean(可中止的并发预清理)

本阶段尽可能承担更多的并发预处理工作,从而减轻在Final Remark阶段的stop-the-world

在该阶段,主要循环的做两件事:

  • 处理 From 和 To 区的对象,标记可达的老年代对象;
  • 和上一个阶段一样,扫描处理Dirty Card中的对象。

具体执行多久,取决于许多因素,满足其中一个条件将会中止运行:

  • 执行循环次数达到了阈值;
  • 执行时间达到了阈值;
  • 新生代Eden区的内存使用率达到了阈值。

Phase 5: Final Remark(重新标记)

预清理阶段也是并发执行的,并不一定是所有存活对象都会被标记,因为在并发标记的过程中对象及其引用关系还在不断变化中。

因此,需要有一个stop-the-world的阶段来完成最后的标记工作,这就是重新标记阶段(CMS标记阶段的最后一个阶段)。主要目的是重新扫描之前并发处理阶段的所有残留更新对象

主要工作:

  • 遍历新生代对象,重新标记;(新生代会被分块,多线程扫描)
  • 根据GC Roots,重新标记;
  • 遍历老年代的Dirty Card,重新标记。这里的Dirty Card,大部分已经在Preclean阶段被处理过了。

Phase 6: Concurrent Sweep(并发清理)

并发清理阶段,主要工作是清理所有未被标记的死亡对象,回收被占用的空间



 

Phase 7: Concurrent Reset(并发重置)

并发重置阶段,将清理并恢复在CMS GC过程中的各种状态,重新初始化CMS相关数据结构,为下一个垃圾收集周期做好准备。

 

参考

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.html#concurrent_mark_sweep_cms_collector

https://blogs.oracle.com/poonam/understanding-cms-gc-logs

https://blogs.oracle.com/jonthecollector/the-unspoken-phases-of-cms

https://plumbr.io/handbook/garbage-collection-algorithms-implementations#concurrent-mark-and-sweep

https://www.jianshu.com/p/2a1b2f17d3e4

http://psy-lob-saw.blogspot.com/2014/10/the-jvm-write-barrier-card-marking.html

https://www.cnblogs.com/littleLord/p/5380624.html

 

转载请注明来源:https://zhanjia.iteye.com/blog/2435266

 

个人公众号

更多文章,请关注公众号:二进制之路

 

  • 大小: 70.5 KB
  • 大小: 72.5 KB
  • 大小: 82.9 KB
  • 大小: 77.3 KB
  • 大小: 74.6 KB
0
0
分享到:
评论

相关推荐

    51javacms CMS系统 v1.0.9 源代码

     51JAVACMS是一款基于JAVA平台研发的内容管理系统,依托JAVA的高效、安全、稳定等优势,并且汲取了php的简洁和方便,开创国内JAVA版开源CMS之先河。 这个系统没有去做日志;审核;复杂权限等企业级的功能;主要想...

    JAVA gc日志分析工具GChisto及CMS GC补丁

    GChisto及CMS GC相应补丁文件,补丁文件未亲测。 This patch adds the following features and improvements when using CMS GC in incremental mode: detecting Full GCs corrected parsing errors when using -XX:...

    51javacms CMS系统 v1.0.9 正式版.zip

    51JAVACMS是一款基于JAVA平台研发的内容管理系统,依托JAVA的高效、安全、稳定等优势,并且汲取了php的简洁和方便,开创国内JAVA版开源CMS之先河。 这个系统没有去做日志;审核;复杂权限等企业级的功能;主要想的...

    18个Java开源CMS系统一览.doc

    18个Java开源CMS系统一览.doc

    51javacms CMS系统 v1.0.9 源代码.rar

    51JAVACMS是一款基于JAVA**台研发的内容管理系统,依托JAVA的高效、安全、稳定等优势,并且汲取了php的简洁和方便,开创国内JAVA版开源CMS之先河。 这个系统没有去做**志;审核;复杂权限等企业级的功能;主要想...

    基于java的开发源码-tjpcms国产java类cms.zip

    基于java的开发源码-tjpcms国产java类cms.zip 基于java的开发源码-tjpcms国产java类cms.zip 基于java的开发源码-tjpcms国产java类cms.zip 基于java的开发源码-tjpcms国产java类cms.zip 基于java的开发源码-tjpcms...

    JAVA开源cms

    JAVA开源cms

    java CMSjava CMSjava CMS

    java CMS

    Java完整CMS(可直接拿来用)

    Java完整CMS(可直接拿来用) 不用自己再去慢慢的写了。

    现代化的Java博客 / CMS 系统.zip

    现代化的Java博客 / CMS 系统 现代化的Java博客 / CMS 系统 现代化的Java博客 / CMS 系统 现代化的Java博客 / CMS 系统 现代化的Java博客 / CMS 系统 现代化的Java博客 / CMS 系统 现代化的Java博客 / CMS ...

    基于java的开发源码-Jease Java CMS.zip

    基于java的开发源码-Jease Java CMS.zip 基于java的开发源码-Jease Java CMS.zip 基于java的开发源码-Jease Java CMS.zip 基于java的开发源码-Jease Java CMS.zip 基于java的开发源码-Jease Java CMS.zip 基于java的...

    java_cms源码2018版

    java_cms源码2018版.zip,包含栏目:关于我们,公司活动,新闻资讯,产品荟萃,产品下载,其他相关,人才招聘,服务指南,联系我们,栏目设置种类齐全,支持文字,图片,视频等多种展示方式。

    51javacms CMS系统 v1.0.9 正式版.rar

    51JAVACMS是一款基于JAVA**台研发的内容管理系统,依托JAVA的高效、安全、稳定等优势,并且汲取了php的简洁和方便,开创国内JAVA版开源CMS之先河。 这个系统没有去做**志;审核;复杂权限等企业级的功能;主要想的...

    javaCMS 生成静态页面简单列子

    java CMS 生成静态页面 通过后台发布来改变网站内容

    Java CMS内容管理系统

    Java CMS内容管理系统

    java开源CMS管理系统jeetemp

    java..java开源CMS管理系统jeetemp 为了压缩文件我把WEB-INF下面的lib包打包放在 网盘下载地址:http://pan.baidu.com/s/1FMOb0

    介绍一个java版的CMS内容管理系统.zip

    介绍一个java版的CMS内容管理系统.zip 都知道php版的CMS多如牛毛,反观JAVA版的CMS就屈指可数,今天介绍一个

    java cms

    java cms 内容管理系统. JEECMS v6 源码 内含mysql数据库文件

    基于java的CMS系统

    本系统采用纯java语言编写,操作方便,功能齐全,自动生成静态化页面,便于搜索引擎收录。 网站栏目完全自定义,满足是常网站的一切需求。用户只需会打字,简单排版,即可以轻松快捷的建立起属于自己的站点。 本系统...

    jeecms java版本CMS

    jeecms java版本CMS

Global site tag (gtag.js) - Google Analytics