我刚刚读了一些有关G1算法的博客。
我对记忆集的使用感到困惑。
这是我的理解:
既然我们可以使用DFS遍历从GC-Roots引用的每个引用,那么为什么我们需要记忆集?
因为所有的博客都说使用记忆集的原因是我们不需要检查每个区域,以查看是否有一个对象被GC-Roots引用。
我刚刚读了一些有关G1算法的博客。
我对记忆集的使用感到困惑。
这是我的理解:
既然我们可以使用DFS遍历从GC-Roots引用的每个引用,那么为什么我们需要记忆集?
因为所有的博客都说使用记忆集的原因是我们不需要检查每个区域,以查看是否有一个对象被GC-Roots引用。
实际上,这就是为什么G1
成为了一种分代式垃圾收集器:这些已记忆集
的大小非常庞大。如果将堆划分为年轻代
和老年代
,则无需保留年轻代之间的连接,因为您无论如何会一次性扫描它们,从而减少这些集合的大小。 G1
希望保持那个200毫秒
(默认值)的承诺-为此,您需要一次性扫描年轻代(因为在已记忆集
中没有区域之间的连接,否则堆完整性将丢失),但与此同时,如果使年轻代较小,则已记忆集
的大小将会很大。
因此,调整这些设置是一项工程奇迹,个人认为。
记忆集
是卡表
的更精确版本,因为卡表
仅知道哪个区域,而记忆集
则知道确切地址。 - ratsafalig