RSet的存放形式

RSet的存放形式

RSet的存放形式 #

考虑某个 Region 的 RSet,它可能会因为引用关系比较多,而变得很大。根据另一个 Region 对这个 Region 的引用数量,可以分为少、中、多三种情况。针对这三种情况,RSet 准备了三种不同的数据结构来应对,分别是稀疏表、细粒度表和粗粒度表。三种表之间的关系是不断粗化的,如下图所示:

  1. 稀疏表是一个哈希表,当 Region A 对 Region B 的引用很少时,就可以将相关的 card 放到稀疏表里;
  2. 细粒度表则是一个真正的 card table,当 Region 之间的引用比较多时,就可以直接使用位图来代替哈希表,因为这能加快查找的速度(使用位操作代替哈希表的查找);
  3. 粗粒度表则是一个区的位图,因为相对来说,区是比较少的,所以粗粒度表的大小也很小。当 Region A 对 Region B 的引用非常多时,就不用再使用 card table 来进行管理了,在回收 Region B 时,直接将 Region A 的全部对象都遍历一次就可以了。

总之,随着其他 Region 对本 Region 的引用关系越多,RSet 存放引用关系使用的表粒度就越粗,这样做主要是为了减少 RSet 记录数,提高定位效率。

Viewpoint #

From #

22 | G1 GC:分区回收算法说的是什么?