cms和g1垃圾收集器之间有什么不同,这使得g1更好?
大多数地方--据说这是因为在G1中,堆被划分为区域,然后将区域集合标记为年轻/老代,gc运行在少数区域上,而不是在整个堆上。我正试图进一步理解这一点,并且没有其他问题:
当年轻的gc运行(这是停止世界)时,
上述各点是否正确?还有哪些不同之处使g1变得更好?
发布于 2021-01-02 15:06:27
我将补充我知道的几个理由。
您可以有效地指示G1尽力在暂停目标时间内完成其工作。在内部,它将根据以前收集的统计数据选择要处理的区域数目。因此,它还将调整区域的大小。你不能用CMS做这件事。
CMS只有一个card table内部结构,这意味着它需要始终被完全扫描。另一方面,G1使用Remembered Sets,它的大小较小,可以(快速)判断需要扫描哪些其他区域作为当前区域的一部分。
是的,G1可以扫描young和一小部分旧的mixed collections (您可以通过标志配置大小),但这意味着它比仅仅扫描旧的要快得多。
最有可能是在G1早期启动理论工作的最大诱因,至少我与CMS一起工作的“年长”团队成员说,这是最大的痛苦之一。CMS根本不做任何压缩。当对象不能移动到old generation时(因为这一代的“差距”太小)--一切都停止了,空间需要处理。这是非常昂贵的,花了很多时间。另一方面,每个G1循环都会在移动活动对象并使区域空置时进行压缩。
也许还有很多其他的原因我还不知道。
https://stackoverflow.com/questions/65536661
复制相似问题