2

cms 和 g1 垃圾收集器之间有什么区别使 g1 更好?

大多数地方都说这是因为在 G1 中,堆被划分为区域,然后将区域集合标记为年轻/老年代,并且 gc 在少数区域而不是整个堆上运行。我试图进一步理解这一点,并有几个问题:

  1. 当年轻 gc 运行(即停止世界)时,它会在所有年轻代区域上运行,这意味着堆的整个年轻部分和年轻代的不少区域。那么它在时间上与 CMS 相同吗?

  2. 增量压缩 - 混合收集 - 现在这是我认为 G1 具有优势的地方,因为整个堆的并发标记不断发生,并且在所有年轻区域 + 少数旧区域(首先是大多数垃圾)上运行的混合 gc 周期。所以它会继续从老年代清除垃圾,而不是等待 Full gc 发生。这是正确的吗 ?

上述几点是否正确?还有哪些其他区别使 g1 更好?

4

1 回答 1

3

我将添加一些我知道的原因。

  • 暂停目标时间

您可以有效地指示G1在暂停目标时间内尽最大努力完成工作。在内部,它将根据以前收集的统计信息选择要处理的区域数。因此,它也会调整区域的大小。你不能用CMS.

  • 记忆集

CMS只有一个card table内部结构,这意味着它需要始终被完全扫描。另一方面G1使用Remembered Sets,它们的尺寸更小,并且可以(快速)告知需要扫描哪些其他区域作为当前区域的一部分。

  • 混合收藏

是的,G1可以扫描年轻加上一小部分旧的 - 称为mixed collections(您可以通过标志配置大小),但这意味着它比仅扫描旧的要快得多,完全。

  • 碎片化

很可能是早期开始理论工作的最大触发因素G1,至少我的“年长”队友CMS说这是最大的痛苦之一。CMS根本不做任何压缩。当无法将对象移动到时old generation(因为那一代的“间隙”太小) - 一切都停止了,需要处理该空间。这变得非常昂贵并且花费了很多时间。另一方面,每个G1循环都会在移动活动对象并留下空白区域时进行压缩。


可能还有很多其他的原因我还不知道。

于 2021-01-02T15:06:27.387 回答