Java CMS GC:在最后一句话和并发扫描之间可以发生较小的GC吗?



Final remark确保标记所有活物。

Concurrent sweep去除垃圾。

我的假设是,JVM确保在final remark相和concurrent sweep相之间不会运行次要GC,否则将要执行另一种备注以跟踪刚刚促进到旧GC的对象。我的假设正确吗?

对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] 

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

我的假设正确吗?

您没有考虑几种可能性

  • Young Collections暂停了扫描并跟踪促销活动,以便扫描线程可以在恢复时跳过促销活动
  • 促销在原子上传达
  • 在并发扫描期间发生在记忆区域中不会被扫荡
  • 触摸的记忆区域

最新更新