在 Java 9 中,G1 GC 是默认的垃圾收集器。截至目前,我听说 有些人更喜欢 CMS 垃圾收集器 而不是 G1GC,因为它似乎不稳定并且有一些严重的错误。
ParallelGC 发生了什么(这些天没有嗡嗡声)?有没有我们更喜欢 ParallelGC 而不是 CMS/G1 的用例?
此外,是否存在 SerialGC 可以执行所有这些并行收集器的情况?
原文由 Shailesh Pratapwar 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Java 9 中,G1 GC 是默认的垃圾收集器。截至目前,我听说 有些人更喜欢 CMS 垃圾收集器 而不是 G1GC,因为它似乎不稳定并且有一些严重的错误。
ParallelGC 发生了什么(这些天没有嗡嗡声)?有没有我们更喜欢 ParallelGC 而不是 CMS/G1 的用例?
此外,是否存在 SerialGC 可以执行所有这些并行收集器的情况?
原文由 Shailesh Pratapwar 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.2k 阅读
8 回答6k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
串行收集器
主要针对单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)。
算法:
因此,不太可能出现碎片。
由于 Java
9
,这是服务器类机器(多 cpu 类 unix 机器或任何 64 位 jvm)的默认设置。为什么默认使用 G1?
主要原因是为了减少 gc 暂停时间,尽管整体吞吐量可能会降低。