单个 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
使用了两种类型的线程:ParallelGCThreads
和 ConcGCThreads
,它们实现了不同的目的。
如果我从上面做同样的练习(启动一个进程并连接到它,但是也启用了-XX+UseG1GC
),我看到ParallelGCThreads
没有改变(默认为 10
),ConcGCThreads
也没有改变(默认为 3
);这对我来说是一个惊喜。或不。这取决于您如何看待它 - VM 试图禁止使用 G1GC
开始。
当然,10 个并行线程竞争 1 个 CPU 并不是 set-up 您的 VM 的好方法。
我正在为一个应用程序使用 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
使用了两种类型的线程:ParallelGCThreads
和 ConcGCThreads
,它们实现了不同的目的。
如果我从上面做同样的练习(启动一个进程并连接到它,但是也启用了-XX+UseG1GC
),我看到ParallelGCThreads
没有改变(默认为 10
),ConcGCThreads
也没有改变(默认为 3
);这对我来说是一个惊喜。或不。这取决于您如何看待它 - VM 试图禁止使用 G1GC
开始。
当然,10 个并行线程竞争 1 个 CPU 并不是 set-up 您的 VM 的好方法。