java - 我应该在单 CPU 系统上使用串行 GC 还是 G1GC?

标签 java garbage-collection java-11 g1gc

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

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

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

最佳答案

根据 the documentation .

The serial collector uses a single thread to perform all garbage collection work, which makes it relatively efficient because there is no communication overhead between threads.

It's best-suited to single processor machines because it can't take advantage of multiprocessor hardware, although it can be useful on multiprocessors for applications with small data sets (up to approximately 100 MB).

我假设文档中的处理器 = 核心(以及您的问题)。虽然文档说串行收集器不是多核机器的好选择,但并没有说其他收集器不适合单核机器。

虽然其他收集器确实倾向于使用多线程,但您无法在单核环境中获得这些收集器的全部好处。

那么你为什么看到 G1GC 被使用了?也许没有其他原因,因为它是最新的。但是,如果有原因的话,很可能是 G1 提供的更短的 GC 暂停:

If response time is more important than overall throughput and garbage collection pauses must be kept shorter than approximately one second, then select a mostly concurrent collector with -XX:+UseG1GC or -XX:+UseConcMarkSweepGC.

最好的情况是,在这些情况下,他们测量了不同收集器的性能,并选择了提供最佳结果的那个。

还要考虑评论中提到的 String deduplication Holger。这是一个特定的内存优化,可能是使用 G1GC 的原因。毕竟,如果您只有一个内核,您可能也没有太多内存可供您使用。

关于java - 我应该在单 CPU 系统上使用串行 GC 还是 G1GC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57921891/

相关文章:

JavaScript:从该监听器中删除事件监听器?

java - Camel 路线未在 xml 文件中解析

java - 配置 OpenJFX 11 以将其 DLL 提取到不同的用户指定目录中?

memory-leaks - 为什么 Java11 将 java.util.zip.ZipFile$Source 保留在堆上?

java - 错误: java: cannot find symbol symbol: class MockitoJUnitRunner

java - 按名称获取 Swing 组件

java - FileReader 无法找到文件,即使它位于工作目录中

java - JAX-RS 请求获取自定义对象

c# - 静态成员是否会阻止实例类被 GC 处理?

python - 在处理 C 代码时是否存在任何 Python 引用计数/垃圾收集问题?