单个 CPU 机器的最佳 GC 线程数

Optimal number of GC threads for a single CPU machine

我正在为一个应用程序使用 G1 垃圾收集器,该应用程序应该使用单个 CPU 核心(它是 Yarn 上的 Spark 作业 运行),但可能是因为 JVM 看到了所有可用的核心,它使用相当多的并行线程,从 18 到 23。这真的很重要吗?我应该手动设置并行线程数吗?

这是一个相当有趣的观察,首先(至少在 jdk-15)。

假设这段代码:

public class Sandbox {
      
    public static void main(String[] args) {

        while (true) {
           LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(10_000));
       }

    }
  
}

我 运行 它与:java -XX:ActiveProcessorCount=1 Sandbox.java。通过以下方式连接到它:jcmd <PID> VM.flags 并注意到一个相当有趣的事情:-XX:+UseSerialGC。由于您指定了 single CPU,因此根据 JVM 使用 G1GC 毫无意义(这是有道理的)。所以做好准备。


您可以通过以下方式获得所需内容:-XX:ActiveProcessorCount=,这是您的 JVM 将看到的 CPU 数量(并且很可能基于此在内部构建试探法)。

G1 使用了两种类型的线程:ParallelGCThreadsConcGCThreads,它们实现了不同的目的。

如果我从上面做同样的练习(启动一个进程并连接到它,但是也启用了-XX+UseG1GC),我看到ParallelGCThreads 没有改变(默认为 10),ConcGCThreads 也没有改变(默认为 3);这对我来说是一个惊喜。或不。这取决于您如何看待它 - VM 试图禁止使用 G1GC 开始。

当然,10 个并行线程竞争 1 个 CPU 并不是 set-up 您的 VM 的好方法。