cms与g1垃圾收集器

vom3gejh  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(552)

cms和g1垃圾收集器之间的区别是什么使g1更好?
大多数地方都说这是因为在g1中,堆被划分为区域,然后区域集合被标记为年轻/老年代,gc在少数区域上运行,而不是在整个堆上运行。我正试图进一步理解这一点,还有几个问题:
当young gc运行时(也就是stop the world),它运行在所有的年轻代区域上,这意味着堆的整个年轻部分,而不是年轻代的少数区域。那么它在时间上是否与cms相同呢?
增量压缩-混合收集-现在我认为g1的优势就在这里,因为整个堆的并发标记一直在发生,并且有混合gc循环在所有年轻区域+少数旧区域上运行(大多数垃圾优先)。因此,它也不断地从旧一代中移除垃圾,而不是等待完全gc的发生。对吗?
以上几点正确吗?还有哪些区别使g1更好呢?

fjnneemd

fjnneemd1#

我将补充一些我知道的理由。
暂停目标时间
你可以有效地指导 G1 尽力在目标时间内完成工作。在内部,它将根据以前收集的统计数据选择要处理的区域数。它也会因此调整区域大小。你不能这样做 CMS .
记忆集 CMS 只有一个 card table 内部结构,这意味着它总是需要被完全扫描。另一方面 G1 使用 Remembered Sets ,它们的大小更小,并且可以(快速)判断哪些区域需要作为当前区域的一部分进行扫描。
混合收藏
对, G1 可以扫描年轻人加上一小部分老年人 mixed collections (您可以通过标志来配置大小),但这意味着它比只扫描旧的、完整的文件要快得多。
碎片
很可能是早期开始理论研究的最大导火索 G1 ,至少是和我一起工作过的“老”队友 CMS ,说这是最大的痛苦之一。 CMS 根本不做任何压实。当对象无法移动到 old generation (因为“差距”在那一代人中太小了)-一切都停止了,这个空间需要改进。这变得非常昂贵,花费了很多时间。另一方面,每个 G1 循环在移动活动对象时进行压缩,并将区域留空。
可能还有很多其他原因我还不知道。

相关问题