GC 怎么知道老年代里哪些对象在引用年轻对象?答案是写屏障和卡表,它们藏在每一次引用赋值里。这篇先验证「老年代指向年轻对象」确实能让它活下来,再测不同回收器下引用存储与 int 存储的耗时差(G1 的记忆集见前面一篇)。
老年代对象 Holder 持有一个年轻对象(没有别的引用):经历 5 次年轻代 GC 之后,弱引用是否还在:true 把 Holder.ref 置为 null 之后再经历 3 次年轻代 GC:弱引用是否还在:false(Holder 还活着:true)
回收器 int 存储 引用存储 引用读取 引用存储 ÷ int 存储 Serial 0.379 0.520 0.460 1.37 Parallel 0.381 0.519 0.466 1.36 G1 0.412 1.124 0.841 2.73 ZGC 0.410 0.756 0.716 1.84