2011-01-21 6 views
308

Javaコード内から自分のアプリケーションで使用できるコアの数を調べるにはどうすればよいですか?Javaでのコア数の確認

+2

。 –

+26

純粋にJavaを使用して、物理的にマシンのハードコア数を確認します。 * Runtime.getRuntime()。availableProcessors()*を使用すると、起動時にJavaプログラムが使用できるコアの数を簡単に見つけることができます。すべての主要な現代のOSがCPU親和性を設定する能力(すなわち、特定の数のコアのみにアプリケーションを制限する)のため、これは留意すべき懸念事項である。 – SyntaxT3rr0r

+4

論理コアまたは物理コア?重要な違いがあります。 –

答えて

523
int cores = Runtime.getRuntime().availableProcessors(); 

coresの場合は、1未満である、どちらかあなたのプロセッサが死ぬしようとしている、またはあなたのJVMがそれに重大なバグがある、または宇宙が爆破しようとしています。

+0

'Runtime'クラスから集められた情報のほとんどがストリング、私はこれが "整数"を返すことを示すことが役に立つと思った。 –

+77

これにより、論理スレッドの数がわかります。例えばハイパースレッディングをオンにしている場合は、コアの数の2倍になります。 –

+4

@Peter、ええ、良い点。私は自分のi7マシンでこのアクションを実行するとき自分自身がヒルの王様だと感じました! :) –

-2

これはCygwinのとWindows上で動作しますがインストールさ:

System.getenv("NUMBER_OF_PROCESSORS")

+0

私はこれを試しましたが、nullを返しました:( – Adelin

+0

Cygwinがインストールされていますが、これはWindowsのシェルから動作します: '' groovy -e "println System.getenv( 'NUMBER_OF_PROCESSORS')' '' –

+0

わかりませんこれが標準のWindows環境変数であれば私の頭の上から外してください: '' set NUMBER_OF_PROCESSORS'''はWindowsのコマンドラインから動作します –

12

を使用すると、物理コアの数を取得したい場合は、CMDおよびターミナルコマンドを実行することができ、その後、あなたが必要とする情報を取得するために、出力を解析します。以下に、物理コアの数を返す関数を示します。

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; 
} 

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"; 
    } 
} 

}

+1

これはOOPされるのに適したコードです。 :) –

+1

OSValidatorクラスはOSXをサポートしますが、getNumberOfCoresはそれを完全に無視します。とにかく、https://blog.opengroup.org/2015/10/02/mac-os-x-el-capitan-achieves-unix-certification/ですから、「Mac」はあなたのisUnix()内にあるはずですが.. 。 BSD、OSXの場合、lscpuコマンドは存在せず、getNumberOfCoresは0を返します。 –

+1

Linuxでは、 "Socket(s)"によって複数の "ソケットごとのコア"を設定する必要があります。また、私は正規表現を使用します。 –

関連する問題