cms和g1垃圾收集器之间的区别是什么使g1更好?
大多数地方都说这是因为在g1中,堆被划分为区域,然后区域集合被标记为年轻/老年代,gc在少数区域上运行,而不是在整个堆上运行。我正试图进一步理解这一点,还有几个问题:
当young gc运行时(也就是stop the world),它运行在所有的年轻代区域上,这意味着堆的整个年轻部分,而不是年轻代的少数区域。那么它在时间上是否与cms相同呢?
增量压缩-混合收集-现在我认为g1的优势就在这里,因为整个堆的并发标记一直在发生,并且有混合gc循环在所有年轻区域+少数旧区域上运行(大多数垃圾优先)。因此,它也不断地从旧一代中移除垃圾,而不是等待完全gc的发生。对吗?
以上几点正确吗?还有哪些区别使g1更好呢?
1条答案
按热度按时间fjnneemd1#
我将补充一些我知道的理由。
暂停目标时间
你可以有效地指导
G1
尽力在目标时间内完成工作。在内部,它将根据以前收集的统计数据选择要处理的区域数。它也会因此调整区域大小。你不能这样做CMS
.记忆集
CMS
只有一个card table
内部结构,这意味着它总是需要被完全扫描。另一方面G1
使用Remembered Sets
,它们的大小更小,并且可以(快速)判断哪些区域需要作为当前区域的一部分进行扫描。混合收藏
对,
G1
可以扫描年轻人加上一小部分老年人mixed collections
(您可以通过标志来配置大小),但这意味着它比只扫描旧的、完整的文件要快得多。碎片
很可能是早期开始理论研究的最大导火索
G1
,至少是和我一起工作过的“老”队友CMS
,说这是最大的痛苦之一。CMS
根本不做任何压实。当对象无法移动到old generation
(因为“差距”在那一代人中太小了)-一切都停止了,这个空间需要改进。这变得非常昂贵,花费了很多时间。另一方面,每个G1
循环在移动活动对象时进行压缩,并将区域留空。可能还有很多其他原因我还不知道。