我有一个.jar文件,我想在超级计算机上运行。有大约40个CPU节点可用,但Java在运行我的程序时只使用其中一个。有没有办法告诉Java使用所有可用的节点来运行给定的程序(最好不重新编译程序)?
答案 0 :(得分:2)
默认情况下,Java始终使用所有可用的CPU。默认情况下,当您启动它时,为每个逻辑CPU创建一个线程,仅用于执行GC。
有大约40个CPU节点可用,但Java在运行我的程序时只使用其中一个
问题是你的程序只使用一个thred,因为这是你编写程序的方式。如果您希望程序使用更多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而无需任何特殊选项。
我看到Java在运行120个CPU和3 TB主内存的服务器上运行正常。当Java程序使用多个NUMA区域时会遇到一些问题,但我怀疑这是你的问题。