CMS的initial mark标记了哪些对象

今天看到一个问题:CMS的initial mark阶段,到底处理标记哪些对象呢?泉子给出的建议是:cms gc initmark阶段主要是标记gc roots直接可达的对象 间接可达的通过其他阶段去标记。

我这边最近对源码比较感兴趣,就跟了下源码: 首先在,openjdk-jdk8u-jdk8u/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp这文件中,搜索initial mark,可以看到 initial mark的入口在VM_CMS_Initial_Mark.doit()方法中实现;

跟进去看到:_collector->do_CMS_operation(CMSCollector::CMS_op_checkpointRootsInitial, gch->gc_cause());这行代码

回到concurrentMarkSweepGeneration.cpp的6644行,这就找到了:checkpointRootsInitial(true),就是这个方法来实现具体的初始标记工作

跟进去看下,在当前文件的3641行,再继续往下跟进,会到3677行:checkpointRootsInitialWork这个方法,经过打日志、重置PLAB等工作后,真正的初始标记就可以开始了,假设是串行版本,会到下面的代码:

// The serial version.
      CLDToOopClosure cld_closure(&notOlder, true);
      //为年轻代的引用遍历做准备
      gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel.
      //
      gch->gen_process_roots(_cmsGen->level(),
                             true,   // younger gens are roots
                             true,   // activate StrongRootsScope
                             GenCollectedHeap::ScanningOption(roots_scanning_options()),
                             should_unload_classes(),
                             &notOlder,
                             NULL,
                             &cld_closure);

跟着gen_process_roots下去后,可以看到gen_process_roots,用来处理直接从gc root直达的对象。

所以只要搞清楚gc root的定义就OK,就要参考R大在知乎的一个回答,因此在做cms gc时,gc root除了一般定义的那些节点外,还需要加上从年轻代到老年代的引用。

参考资料

  1. gc为什么要分代
  2. understanding-cms-gc-logs
  3. garbage-collection-algorithms

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

不同的垃圾回收器的比较

现在已经是2014年了,但是对大多数开发人员而言有两件事情仍然是个谜——垃圾回收以及异性(码农又被嘲笑了)。由于我对后者也不是特别了解,我想我还是试着说说前者吧...

591
来自专栏架构师之旅

Java9中的GC调优基础

在经过了几次跳票之后,Java 9终于在原计划日期的整整一年之后发布了正式版。Java 9引入了很多新的特性,除了闪瞎眼的Module System和REPL,...

2487
来自专栏架构师之旅

关于JVM内存、垃圾回收、性能调优总结篇

本篇文章适用于具有一定Java开发经验的同学,对于深入理解Java虚拟机的原理以及提升Java程序的性能,对于以后求职面试也能起到很大作用。下面开始今天的主题:

1751
来自专栏java一日一条

不同的垃圾回收器的比较

现在已经是2014年了,但是对大多数开发人员而言有两件事情仍然是个谜——垃圾回收以及异性(码农又被嘲笑了)。由于我对后者也不是特别了解,我想我还是试着说说前者吧...

482
来自专栏Golang语言社区

golang 垃圾回收 gc

摘要 在实际使用go语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go语言的垃圾回收模型进行一些研究。本文对研究的结果进行一下总结。 什么是垃圾回收...

2.2K8
来自专栏java一日一条

JVM总体概括一:让我们知道在什么样的平台上舞蹈

比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问...

892
来自专栏java一日一条

Java 9 中的 GC 调优基础

在经过了几次跳票之后,Java 9终于在原计划日期的整整一年之后发布了正式版。Java 9引入了很多新的特性,除了闪瞎眼的Module System和REPL,...

1042
来自专栏Golang语言社区

Golang 语言gc 问题

在实际使用go语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go语言的垃圾回收模型进行一些研究。本文对研究的结果进行一下总结。 什么是垃圾回收? 曾...

37916
来自专栏Java架构师学习

Java GC你不得不知的那些事

1863
来自专栏纯洁的微笑

jvm系列(八):jvm知识点总览

在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功。对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招...

39311

扫码关注云+社区

领取腾讯云代金券