我应该在单 CPU 系统上使用 SerialGC 还是 G1GC?

我有一个仅限 1 个 CPU 的容器,这是 java 11+ 的默认情况(也可能更旧),在这种情况下它给用户 SerialGC。我应该强制执行线程 GC(如 G1GC)还是将其留在 SerialGC?

哪一个在单CPU上性能更好?我一直认为 SerialGC 在这种情况下更好,但我经常看到 G1GC 在某些情况下被强制。

编辑:我要求提供一般情况,因为我们有很多不同的应用程序使用相同的配置运行,并且很难测试每种情况。


MMMHUHU
浏览 160回答 4
4回答

慕尼黑的夜晚无繁华

根据文档。串行收集器使用单个线程来执行所有垃圾收集工作,这使得它相对高效,因为线程之间没有通信开销。它最适合单处理器计算机,因为它无法利用多处理器硬件,尽管它在具有小数据集(最多大约 100 MB)的应用程序的多处理器上很有用。我假设文档中的处理器=核心(以及你的问题)。虽然文档说串行收集器对于多核机器来说不是一个好的选择,但它并没有说其他收集器对于单核机器来说是不好的。不过,其他收集器确实倾向于使用多线程,并且您无法在单核环境中获得这些线程的全部好处。那么为什么会看到使用G1GC呢?也许没有别的原因,只是因为它是最新的。然而,如果有原因的话,很可能是 G1 提供的更短的 GC 暂停:如果响应时间比总体吞吐量更重要,并且垃圾收集暂停必须保持在大约一秒以内,则使用 -XX:+UseG1GC 或 -XX:+UseConcMarkSweepGC 选择大多数并发收集器。最好的情况是,在这些情况下,他们使用不同的收集器测量性能并选择提供最佳结果的收集器。还要考虑评论中提到的字符串去重 Holger。这是一种特定的内存优化,可能是使用 G1GC 的原因。毕竟,如果您有一个核心,您可能也没有太多内存可供使用。

红颜莎娜

你想优化什么?您是否希望始终能够极快地回答问题或拥有更好的整体表现?在第一种情况下,您应该以较短的 GC 暂停为目标,在第二种情况下,应以所有 GC 暂停的总和较低为目标。您还需要考虑其他因素(即应用程序重新启动的频率),因此在我看来,最好的方法是数据驱动的方法。使用GC easy或GC 查看器分析每个应用程序的性能并采取相应措施。请记住,GC 调整并不总是需要的,因此如果您不知道要实现什么目标,您可能会过早地进行优化。一般来说:对于暂停时间要求不低并且在资源较少的环境中运行的应用程序使用串行GC如果您有更多资源或需要快速回答,请使用G1 垃圾收集器(记得测量更改前后的性能)

守候你守候我

作为更一般性的评论,不要假设因为您只有一个核心/CPU,所以使任务成为多线程不会有任何好处。根据所涉及的任务(在本例中为 GC),很可能存在一个线程被阻塞的情况(例如,等待 IO 完成),这允许执行另一部分任务的其他线程使用处理器并完成有用的工作。尽管一次只能运行一个线程,但总体性能得到了提高。

30秒到达战场

本线程中未提及的一件重要事情是 G1GC 可以将内存返回(取消提交)给操作系统,因此如果其他应用程序正在服务器上运行,它们可以使用它。我在从单 vCPU 服务器切换到 2 vCPU 服务器时注意到了这一点,因为 java 默认情况下对单 CPU 使用 SerialGC,对多 CPU 使用 G1GC(至少对于 JDK 11 是这样)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java