Final remark
确保标记所有活动对象。Concurrent sweep
清除垃圾。
我的假设是,JVM确保次要gc不会在final remark
阶段和concurrent sweep
阶段之间运行,否则要执行另一项操作以跟踪刚刚升级为旧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]
如您所见,年轻的收集发生在并发扫描开始和结束之间。
我的假设正确吗?
您没有考虑几种可能性
年轻的集合暂停扫描并跟踪促销,以便扫描线程在恢复时可以跳过提升的集合
晋升是原子传达的
在并发扫描期间,升级发生在扫描不会触及的内存区域中