有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java CMS vs G1垃圾收集器

cms和g1垃圾收集器之间的区别是什么,这使得g1更好

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

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

  2. 增量压缩——混合集合——我认为G1的优势在于 整个堆的并发标记一直在发生,并且有混合的gc循环在运行 所有年轻地区+少数老地区(首先是大多数垃圾)。所以它一直在清除垃圾 老一代也一样,而不是等待完全gc的发生。对吗

上述几点正确吗?还有什么其他的区别使g1更好


共 (1) 个答案

  1. # 1 楼答案

    我将补充一些我知道的原因

    • 暂停目标时间

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

    • 记住的场景

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

    • 混合系列

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

    • 碎片化

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


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