首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java与G1垃圾收集器

Java与G1垃圾收集器
EN

Stack Overflow用户
提问于 2021-01-02 06:46:07
回答 1查看 3.8K关注 0票数 2

cms和g1垃圾收集器之间有什么不同,这使得g1更好?

大多数地方--据说这是因为在G1中,堆被划分为区域,然后将区域集合标记为年轻/老代,gc运行在少数区域上,而不是在整个堆上。我正试图进一步理解这一点,并且没有其他问题:

当年轻的gc运行(这是停止世界)时,

  1. 运行在所有的年轻代区域,这意味着堆中年轻部分的整体,而年轻一代的区域并不少。那么,就所需时间而言,它与CMS完全相同吗?

  1. 增量压缩--混合集合--现在我认为G1具有优势,因为整个堆的并发标记不断发生,并且在所有年轻区域+少数老区域(大多数垃圾优先)上运行混合gc循环。因此,它也继续从老一代中清除垃圾,而不是等待完整的gc发生。对吗?

上述各点是否正确?还有哪些不同之处使g1变得更好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-02 15:06:27

我将补充我知道的几个理由。

  • Pause目标Time

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

  • Remembered Sets

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

  • Mixed Collections

是的,G1可以扫描young和一小部分旧的mixed collections (您可以通过标志配置大小),但这意味着它比仅仅扫描旧的要快得多。

  • Fragmentation

最有可能是在G1早期启动理论工作的最大诱因,至少我与CMS一起工作的“年长”团队成员说,这是最大的痛苦之一。CMS根本不做任何压缩。当对象不能移动到old generation时(因为这一代的“差距”太小)--一切都停止了,空间需要处理。这是非常昂贵的,花了很多时间。另一方面,每个G1循环都会在移动活动对象并使区域空置时进行压缩。

也许还有很多其他的原因我还不知道。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65536661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档