我正在使用甲骨文的Java 1.8.0_231。
设置-XX:ActiveProcessorCount=n的效果是什么?我不是C++的人,但我想我在HotSpot源代码中看到了这两种用法:
但是,它是否实际上限制了JVM可以使用的CPU数量?Java 10发行说明直言不讳地说:
此外,此更改还添加了一个JVM选项,该选项提供了指定JVM将使用的CPU数量的能力。
我担心的是,我有测试结果(在任何Docker、CF等容器之外),这些测试结果似乎显示应用程序使用了所有8个CPU,而不是我设置的4个:
那么,设置ActiveProcessorCount实际上应该限制JVM使用的CPU数量吗?我在HotSpot代码中没有看到任何这样做的地方,而且我的测试结果似乎也拒绝了。
谢谢
发布于 2020-01-23 16:03:19
发布于 2020-04-20 17:00:59
为了补充Mena的另一个答案并证明Kayaman的注释,这个参数的直接作用是设置Runtime.getRuntime().availableProcessors()
返回的值。
为了证明这一点,我创建了一个类
public class Main {
public static void main(String[] args) {
System.out.println("Runtime.getRuntime().availableProcessors() = " +
Runtime.getRuntime().availableProcessors());
}
}
然后,我使用Java 11在12核计算机上编译并运行它,并提供了一些不同的选项:
# Show the version of Java in use
$ java -version
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+10)
OpenJDK 64-Bit Server VM (build 11.0.6+10, mixed mode)
# Run with defaults
$ java -cp . Main
Runtime.getRuntime().availableProcessors() = 12
# Run with limit lower than actual number of cores
$ java -XX:ActiveProcessorCount=4 -cp . Main
Runtime.getRuntime().availableProcessors() = 4
# Run with limit higher than actual number of cores
$ java -XX:ActiveProcessorCount=20 -cp . Main
Runtime.getRuntime().availableProcessors() = 20
这也适用于最新版本的Java8,特别是OpenJDK 1.8.0_242-b08。
如前所述,这有助于调整线程池的大小,但不会对可以使用的CPU核心数量施加任何硬限制。
https://stackoverflow.com/questions/59882464
复制相似问题