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