Final remark
确保标记所有活动对象。
Concurrent sweep
删除了垃圾。
我的假设是JVM确保次要gc不会在final remark
阶段和concurrent sweep
阶段之间运行,否则需要执行另一个备注以跟踪刚刚提升到旧gc的对象。我的假设是否正确?
答案 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]
如您所见,年轻收藏发生在并发扫描开始和结束之间。
我的假设是否正确?
你没有考虑几种可能性