Java - CMS垃圾收集器与G1垃圾收集器的比较

3

cms和g1垃圾收集器有何区别,使得g1更好?

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

  1. 当运行young gc(即全停止),它运行于所有年轻代区域,这意味着堆的整个年轻部分,而不是年轻代的几个区域。 那么,就时间而言,它是否与CMS相同?

  2. 增量压实-混合集合-现在这就是我认为G1具有优势的地方,因为整个堆的并发标记仍在进行, 并且有混合的GC周期,其中运行了所有年轻区域+少量旧区域(先处理最多垃圾的区域)。 因此,它继续从旧代中删除垃圾,而不是等待进行Full gc。这是正确的吗?

以上说法正确吗?还有哪些差异使g1更好?


你正在使用哪个版本的Java?11?8?14? - markspace
我正在使用 Java 11。 - user10916892
然后根据Oracle的文档:“CMS收集器自JDK 9起被弃用。”这将是主要差别。https://docs.oracle.com/en/java/javase/11/gctuning/available-collectors.html#GUID-C7B19628-27BA-4945-9004-EC0F08C76003 - markspace
我的问题实际上是为什么G1比CMS更好,我知道CMS在Java 11中不可用,但我试图了解当G1被引入时,它应该比CMS更好,为什么会这样? - user10916892
请参考以下链接:https://dev59.com/V1QJ5IYBdhLWcg3wFxx_ - Amit kumar
1个回答

6
我会补充几个我所知道的原因。
  • 暂停目标时间

你可以有效地指示 G1 尽其所能在暂停目标时间内完成工作。它将基于先前收集的统计数据选择要处理的区域数量。它还会因此调整区域大小。而这是无法使用 CMS 实现的。

  • Remembered Sets

CMS 仅具有 card table 内部结构,这意味着它必须始终完全扫描。另一方面,G1 使用的是较小的 Remembered Sets,可以(快速)指示当前需要扫描哪些其他 区域。

  • 混合收集

是的,G1 可以扫描年轻代和一小部分老年代,称为 混合收集(可以通过标志配置其大小),但这意味着它比仅扫描整个老年代要快得多。

  • 碎片化

很可能是在早期关于 G1 的理论工作中触发最大的因素之一,至少是我“年长”的团队成员与 CMS 一起工作了很多。他们说这是最大的问题之一。CMS 根本不进行任何压缩。当对象无法移动到老年代(因为该代中的“间隙”太小)时,一切都会停止,需要处理该空间。这变得非常昂贵并且需要很长时间。另一方面,每个 G1 周期都会在移动实际存活的对象的同时进行压缩,并留下空的区域。


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接