在我们的Windows Server 2019上,我们有36个核心和72个逻辑处理器,在任务管理器CPU性能窗口中可以看到。而且,如果从命令提示符,如果我运行命令。
echo %NUMBER_OF_PROCESSORS%
它会告诉我72个。
然而,从Java程序内,如果我运行以下代码片段。
public class NoOfCPUs {
public static void main(String[] args) {
String envName = "NUMBER_OF_PROCESSORS";
String noOfP = System.getenv(envName);
System.out.format("%s (from env) = %s%n", envName, noOfP);
}
}
输出为
NUMBER_OF_PROCESSORS (from env) = 36
在Netbeans IDE中用64位Java 8编译器在Windows上编译。制作了一个可执行的jar.Ran了这个jar,作为。
java -jar NoOfCPUs.jar
同样的系统环境变量,NUMBER_OF_PROCESSORS在命令提示符下和在Java程序中显示出不同的结果。
为什么?
是因为2009年以后Windows使用的逻辑处理器组吗?逻辑处理器组在一个组中最多可以容纳64个处理器。
这似乎与其他类似的问题有关。
而这个bug报告说它将不被支持(不会修复)。
https:/bugs.openjdk.java.netbrowseJDK-6942632。
该bug报告称,应该由用户负责给Java配置合适的CPU数量,这一点可以通过。
我认为你应该考虑运行你的应用程序(和Java)的多个实例,而不是只运行一个,以获得最大的性能,无论如何,因为NUMA定位,虽然不同的Java虚拟机有 对NUMA的支持 根据配置的垃圾收集算法(非并发,因此是Stop-the-World),它仍然可能有可扩展性问题,见。阿姆达斯法则
如果是针对HotSpotVM(源自SunOracle)的限制,你可能想看看不同的Java虚拟机OpenJ9(源自IBM)和其他像 Azul Zing JVM
如果是Windows特有的限制,你可能要考虑切换到不同的操作系统或通过你选择的管理程序运行多个Windows实例。