在 Java 中什么时候选择 SerialGC、ParallelGC 而不是 CMS、G1?

新手上路,请多包涵

在 Java 9 中,G1 GC 是默认的垃圾收集器。截至目前,我听说 有些人更喜欢 CMS 垃圾收集器 而不是 G1GC,因为它似乎不稳定并且有一些严重的错误。

ParallelGC 发生了什么(这些天没有嗡嗡声)?有没有我们更喜欢 ParallelGC 而不是 CMS/G1 的用例?

此外,是否存在 SerialGC 可以执行所有这些并行收集器的情况?

原文由 Shailesh Pratapwar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 467
1 个回答

串行收集器

主要针对单cpu机器。

算法:

它使用单个线程来处理堆,并在任何 gc 期间执行 stop-the-world 暂停。只是把它当作玩具。

这是客户端类机器 (Windows 上的 32 位 jvm 或单 cpu 机器) 的默认设置。


并行收集器

算法:

它使用多个 gc 线程来处理堆,并在任何 gc 期间执行 stop-the-world 暂停。

<= Java 8 ,这是服务器类机器(多 cpu 类 unix 机器或任何 64 位 jvm)的默认值。


内容管理系统收集器

它旨在消除与并行和串行收集器的完整 gc 相关的长时间停顿。

算法:

它使用1个或多个gc线程周期性地扫描老年代,并丢弃未使用的对象,暂停时间很短,但占用更多的cpu时间。

警告:由于 Java 14 ,它已 被删除


G1收集器

它是低暂停/服务器风格的 gc,主要用于大堆(> 4Gb)。

算法:

  • 与 CMS 类似,它使用多个后台 gc 线程来扫描和清除堆。
  • 它将年老代分成多个部分,它可以通过从一部分复制到另一部分来清理年老代。

因此,不太可能出现碎片。

由于 Java 9 ,这是服务器类机器(多 cpu 类 unix 机器或任何 64 位 jvm)的默认设置。


为什么默认使用 G1?

主要原因是为了减少 gc 暂停时间,尽管整体吞吐量可能会降低。

原文由 Eric 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题