我正在为一个应该使用单个 CPU 核心的应用程序使用 G1 垃圾收集器(这是一个在 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
.由于您指定了单个 CPU,因此没有必要使用 G1GC
根据JVM
(这是有道理的)。所以要做好准备。
您可以通过以下方式获得您想要的:-XX:ActiveProcessorCount=
这就是您的 JVM 将看到的 CPU 数量(并且很可能基于此在内部构建试探法)。
有两种类型的线程 G1
用途:ParallelGCThreads
和 ConcGCThreads
, 实现不同的目的。
如果我从上面做同样的练习(启动一个进程并连接到它,但是也启用了 -XX+UseG1GC
),我看到了 ParallelGCThreads
未更改(默认为 10
), ConcGCThreads
也未更改(默认为 3
);这对我来说是一个惊喜。或不。这取决于您如何看待它 - VM 试图禁止使用 G1GC
开始。
当然,10 个并行线程竞争 1 个 CPU 并不是设置 VM 的好方法。
关于java - 单 CPU 机器的最佳 GC 线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64489101/