查找Java中的核心数量

Dam*_*mir 393 java

如何从Java代码中找到应用程序可用的核心数?

dar*_*ioo 679

int cores = Runtime.getRuntime().availableProcessors();
Run Code Online (Sandbox Code Playgroud)

如果cores小于1,您的处理器即将死亡,或者您的JVM中存在严重错误,或者宇宙即将爆炸.

  • 这将为您提供逻辑线程的数量.例如,如果您启用了超线程,则这将是内核数量的两倍. (95认同)
  • @PeterLawrey:似乎不正确,availableProcessors()的Java文档说"在虚拟机的特定调用期间,此值可能会发生变化.因此,对可用处理器数量敏感的应用程序应偶尔轮询此属性并调整其值适当的资源使用." [源(http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#availableProcessors%28%29) (23认同)
  • @Peter Lawrey:它只给出了JVM实际可用的逻辑线程数(我想在启动时).使用CPU亲和性,用户/ OS可以限制JVM看到的"核心"数量.您甚至可以在运行的JVM上执行此操作,但我不太确定这会影响*availableProcessors()*. (14认同)
  • @universe爆炸等等:或者机器实际上有超过2,147,483,647个逻辑线程可用?;) (9认同)
  • @Peter,是的,好点.用我的i7机器执行此操作时,我感觉自己是山丘之王!:) (5认同)
  • @PeterLawrey,我可以确认在带有Java 1.7.0_51的Windows 7 SP1 x64上,availableProcessors()确实随亲和力而变化.你可以通过使用jrunscript来调用java.lang.Runtime.getRuntime().availableProcessors(),用Windows任务管理器更改jrunscript.exe的处理器关联,然后再次运行availableProcessors(),你会看到这个数字.将改变. (5认同)
  • @PierreHenry那么,那就是我们可以在P时间内解决所有NP问题的日子,因为N <= 2 147 483 647 :) (4认同)
  • @PeterLawrey 真正的机器也可以增加或减少 CPU。我用自己的两只手在高端服务器上热插拔处理器(和 RAM)。 (3认同)
  • @ SyntaxT3rr0r我怀疑availableProcessors不会随亲和力而改变. (2认同)
  • @PeterLawrey 有带有热插拔 CPU 的真机。 (2认同)
  • 对于直接在服务器硬件上而不是在虚拟机上运行软件的所有人,我有很多问题。 (2认同)
  • 因其有用且具有幽默感而受到赞誉 (2认同)

adi*_*090 25

如果要获取物理内核的数量,可以运行cmd和terminal命令,然后解析输出以获取所需的信息.下面显示了返回物理核心数的函数.

private int getNumberOfCPUCores() {
    OsValidator osValidator = new OsValidator();
    String command = "";
    if(osValidator.isMac()){
        command = "sysctl -n machdep.cpu.core_count";
    }else if(osValidator.isUnix()){
        command = "lscpu";
    }else if(osValidator.isWindows()){
        command = "cmd /C WMIC CPU Get /Format:List";
    }
    Process process = null;
    int numberOfCores = 0;
    int sockets = 0;
    try {
        if(osValidator.isMac()){
            String[] cmd = { "/bin/sh", "-c", command};
            process = Runtime.getRuntime().exec(cmd);
        }else{
            process = Runtime.getRuntime().exec(command);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    BufferedReader reader = new BufferedReader(
            new InputStreamReader(process.getInputStream()));
    String line;

    try {
        while ((line = reader.readLine()) != null) {
            if(osValidator.isMac()){
                numberOfCores = line.length() > 0 ? Integer.parseInt(line) : 0;
            }else if (osValidator.isUnix()) {
                if (line.contains("Core(s) per socket:")) {
                    numberOfCores = Integer.parseInt(line.split("\\s+")[line.split("\\s+").length - 1]);
                }
                if(line.contains("Socket(s):")){
                    sockets = Integer.parseInt(line.split("\\s+")[line.split("\\s+").length - 1]);
                }
            } else if (osValidator.isWindows()) {
                if (line.contains("NumberOfCores")) {
                    numberOfCores = Integer.parseInt(line.split("=")[1]);
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    if(osValidator.isUnix()){
        return numberOfCores * sockets;
    }
    return numberOfCores;
}
Run Code Online (Sandbox Code Playgroud)

OSValidator类:

public class OSValidator {

private static String OS = System.getProperty("os.name").toLowerCase();

public static void main(String[] args) {

    System.out.println(OS);

    if (isWindows()) {
        System.out.println("This is Windows");
    } else if (isMac()) {
        System.out.println("This is Mac");
    } else if (isUnix()) {
        System.out.println("This is Unix or Linux");
    } else if (isSolaris()) {
        System.out.println("This is Solaris");
    } else {
        System.out.println("Your OS is not support!!");
    }
}

public static boolean isWindows() {
    return (OS.indexOf("win") >= 0);
}

public static boolean isMac() {
    return (OS.indexOf("mac") >= 0);
}

public static boolean isUnix() {
    return (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0 );
}

public static boolean isSolaris() {
    return (OS.indexOf("sunos") >= 0);
}
public static String getOS(){
    if (isWindows()) {
        return "win";
    } else if (isMac()) {
        return "osx";
    } else if (isUnix()) {
        return "uni";
    } else if (isSolaris()) {
        return "sol";
    } else {
        return "err";
    }
}
Run Code Online (Sandbox Code Playgroud)

}

  • 这是一段代码,是一个很好的OOPed候选者.:) (4认同)
  • 最好使用“OS.contains()”而不是“OS.indexOf()”。它提高了可读性并且减少了打字次数。 (2认同)

Ant*_*nio 5

这是找出CPU内核数量(以及许多其他信息)的另一种方法,但是此代码需要附加的依赖关系:

本机操作系统和硬件信息 https://github.com/oshi/oshi

SystemInfo systemInfo = new SystemInfo();
HardwareAbstractionLayer hardwareAbstractionLayer = systemInfo.getHardware();
CentralProcessor centralProcessor = hardwareAbstractionLayer.getProcessor();
Run Code Online (Sandbox Code Playgroud)

获取可用于处理的逻辑CPU的数量:

centralProcessor.getLogicalProcessorCount();
Run Code Online (Sandbox Code Playgroud)