我有一个要在超级计算机上运行的 .jar 文件。有大约 40 个 CPU 节点可用,但 Java 在运行我的程序时只使用其中一个。有没有办法告诉 Java 使用所有可用的节点来运行给定的程序(最好不重新编译程序)?
问问题
870 次
1 回答
2
默认情况下,Java 总是使用所有可用的 CPU。默认情况下,当您启动它时,它会为每个逻辑 CPU 创建一个线程,仅用于执行 GC。
有大约 40 个 CPU 节点可用,但 Java 在运行我的程序时只使用其中一个
问题是您的程序只使用了三分之一,因为这就是您编写程序的方式。如果您希望您的程序使用更多 CPU,您将必须在程序中执行更多独立任务,以便它可以利用更多 CPU。
有没有办法告诉 Java 使用所有可用的节点来运行给定的程序
是的,但你必须在你的代码中这样做,否则它不会神奇地使用比你的程序告诉它更多的 CPU。
我猜是JRE的错。
要么是 20 年前发布的 JRE 有一个错误会停止多线程工作,而且当时没有人修复它,即使大约有 1000 万开发人员使用它,或者你刚刚编写的只有一个人使用的程序有错误在里面。哪个听起来更有可能有错误?
如果您想查看是否可以使用机器上的所有 CPU。
public class Main {
public static void main(String[] args) {
IntStream.range(0, 1000).parallel().forEach(i -> {
long end = System.currentTimeMillis() + 1000;
while (end > System.currentTimeMillis()) {
// busy wait
}
System.out.println("task " + i + " finished");
});
}
}
这将使用您机器上的所有逻辑 CPU,而无需任何特殊选项。
我已经看到在生产环境中运行在具有 120 个 CPU 和 3 TB 主内存的服务器上运行良好的 Java。当您的 Java 程序使用多个 NUMA 区域时,您会遇到一些问题,但我怀疑这是您的问题。
于 2015-09-22T15:00:42.720 回答