Java CMS GC:最终备注和并发扫描之间是否会发生次要GC?

时间:2017-05-04 18:09:13

标签: java garbage-collection jvm

Final remark确保标记所有活动对象。

Concurrent sweep删除了垃圾。

我的假设是JVM确保次要gc不会在final remark阶段和concurrent sweep阶段之间运行,否则需要执行另一个备注以跟踪刚刚提升到旧gc的对象。我的假设是否正确?

1 个答案:

答案 0 :(得分:1)

简单地看一下GC日志就可以反驳这一点。

271943.846: [CMS-concurrent-sweep-start]
271944.597: [GC (Allocation Failure) 271944.597: [ParNew: 608366K->59226K(613440K), 0.0947925 secs] 1715658K->1185554K(2399176K), 0.0948642 secs] [Times: user=0.45 sys=0.02, real=0.09 secs] 
271945.562: [GC (Allocation Failure) 271945.562: [ParNew: 604570K->52122K(613440K), 0.0845590 secs] 1540676K->1007710K(2399176K), 0.0846276 secs] [Times: user=0.38 sys=0.02, real=0.09 secs] 
271945.694: [CMS-concurrent-sweep: 1.666/1.848 secs] [Times: user=7.65 sys=0.91, real=1.85 secs] 

如您所见,年轻收藏发生在并发扫描开始和结束之间。

  

我的假设是否正确?

你没有考虑几种可能性

  • 年轻的收藏品暂停扫描并跟踪促销活动,以便扫描线程可以在恢复时跳过提升的集合
  • 促销以原子方式传达
  • 在并发扫描促销期间发生在扫描无法触及的内存区域