隔代引用与跨区引用解决方法——记忆集
在分代垃圾收集器中,是不是会有隔代引用,也就是说年轻代里的对象引用老年代里对象,同理老年代的对象引用年轻代里的对象。如果是年轻代引用老年代还好说,MinorGC是不会回收这类对象,但是如果是老年代引用年轻代里的对象,MinorGC如何区分年轻代中的对象有没有被老年代引用呢?如果不区分,那么是不是每次回收都要区老年代里去扫描一次?衍生到G1收集器也是一样,不同Region之间如果存在跨区引用,而G1回收是以Region为最小单位,如何避免这种跨区引用被回收?
在分代的垃圾收集器中,在新生代中会有一块内存专门来管理这类跨代引用,我们称之为记忆集(Remembered Set RSet),为什么要用用记忆集,是因为如果不使用记忆集,那么对新生代一次GC都要去老年代去重新扫描一次,防止存在老年代引用年轻代而将年轻代中的对象回收的这种情况,如果不使用记忆集,这就极大的影响垃圾收集的性能。
在G1收集器中它是通过如下的方式:
可以看到G1中每个分区(Region)都有一个RSet,而这个RSet就是记忆集。
记忆集中记录的是引用本区内对象的卡片索引。当要回收本分区时,通过扫描