RSet(Remembered Set)是一个空间换时间的数据结构(已记忆集合)
新生代回收的跨代引用(老年代引用新生代)问题:
新生代的根对象,一部分来自于老年代
老年代再进行细分:card-table
脏卡:说明该处存放对象,引用了外部那些对象
卡表与 Remembered Set
在引用变更时通过 post-write barrier + dirty card queue
concurrent refinement threads 更新 Remembered Set
RSet:
RSet:是在每个Region里,拿出来一小块区域,专门记录哪些Region引用了当前Region的对象。
RSet是个哈希表,key记录了对象所在Region,Value记录了对象所在Card(这里的Card 和 Card Table里面的Card一模一样),具体如下图:
借助RSet如何知道A对象是否被引用:
1、首先检查当前RSet是否有数据,如果RSet为空,表示当前Region里的所有对象没有被其他Region对象引用过,
2、那么只需要利用可达性分析算法扫描当前区域,就可以知道A有没有被引用;
3、如果RSet不为空,则只需要扫描当前Region,和RSet里面的Region 下的某个Card区域。
显而易见,RSet 和 Card Table 具有类似的功能,就是避免在标记垃圾时进行全堆扫描操作。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。