对象之间并不是孤立存在的。新生代中的对象也有可能被老年代中的对象所引用。
在进行MinorGC时,为了找到存活对象,除了在固定的GCRoots上,还需要遍历整个老年代中所有的对象来保证可达性算法的正确性。
这种方法理论上是可行的,但是成本非常高。
这就引出了分代收集理论的第三条假说:相比于同代引用,跨代引用占极少数。
基于第三条假说,我们可以设计这样一个方法:
在新生代上维护一个全局的数据结构(Remembered Set)。RS把老年代分成若干个小块,标识出老年代哪一块内存存在跨代引用。
此后发生Minor GC时,就把包含跨代引用的那个内存中的对象加入到GC Roots集合中去。
这种方法虽然在对象改变引用时需要维护,但是比起扫描整个老年代成本还是比较低的。