Skip to content

Latest commit

 

History

History
17 lines (9 loc) · 922 Bytes

跨代引用.md

File metadata and controls

17 lines (9 loc) · 922 Bytes

跨代引用

对象之间并不是孤立存在的。新生代中的对象也有可能被老年代中的对象所引用。

在进行MinorGC时,为了找到存活对象,除了在固定的GCRoots上,还需要遍历整个老年代中所有的对象来保证可达性算法的正确性。

这种方法理论上是可行的,但是成本非常高。

这就引出了分代收集理论的第三条假说:相比于同代引用,跨代引用占极少数。

基于第三条假说,我们可以设计这样一个方法:

在新生代上维护一个全局的数据结构(Remembered Set)。RS把老年代分成若干个小块,标识出老年代哪一块内存存在跨代引用。

此后发生Minor GC时,就把包含跨代引用的那个内存中的对象加入到GC Roots集合中去。

这种方法虽然在对象改变引用时需要维护,但是比起扫描整个老年代成本还是比较低的。