Javaでコアの数を見つける


411

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


3
ほとんどすべての意図と目的のために「コア==プロセッサ」。
Joachim Sauer

32
マシンが物理的に持っているコアの数を見つけることは、純粋にJavaを使用するのは困難です。Runtime.getRuntime()。availableProcessors()を使用すると、Javaプログラムが起動時に使用できるコアの数を簡単に見つけることができます。すべての主要な最近のOSがCPUアフィニティを設定できる(つまり、アプリケーションを特定の数のコアのみに制限する)ため、これは留意すべき問題です。
SyntaxT3rr0r 2011年

6
論理コアまたは物理コア?重要な違いがあります。
b1nary.atr0phy 2015

回答:


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

coresが1未満の場合は、プロセッサが死ぬか、JVMに重大なバグがあるか、または宇宙が爆発しそうです。


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

6
@ピーター、ええ、良い点。私のi7マシンでこのアクションを実行すると、キングオブザヒルを感じました!:)
Bart Kiers、2011年

14
@Peter Lawrey:実際にJVMで利用可能な論理スレッドの数のみを提供します(起動時に私は推測します)。CPUアフィニティを使用すると、ユーザー/ OSは、JVMが認識する「コア」の数を制限できます。実行中のJVMでそれを行うこともできますが、これがavailableProcessors()にどのように影響するかはよくわかりません。
SyntaxT3rr0r '21年

25
@PeterLawrey:これは正しくないようです。availableProcessors()のJavaドキュメントには、「この値は仮想マシンの特定の呼び出し中に変更される可能性があります。したがって、利用可能なプロセッサの数に敏感なアプリケーションは、このプロパティをときどきポーリングして調整する必要があります。リソースの使用量は適切です。」ソース
JW。

9
@宇宙の爆発など:またはマシンには実際に2,147,483,647以上の利用可能な論理スレッドがありますか?;)
ピエールヘンリー

26

物理コアの数を取得したい場合は、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";
    }
}

}


4
これは、OOPするのに適したコードです。:)
Lyubomyr Shaydariv 2015

1
OSValidatorクラスはOSXをサポートしますが、getNumberOfCoresはそれを完全に無視します。余談として、blog.opengroup.org/2015/10/02/... BSD、OSXのために...()あなたのisUnixにする必要がありますので、「マック」をしかし、何のlscpuコマンドが存在しないと、あなたのgetNumberOfCoresは0を返します
ポールをハーグリーブス

1
Linuxでは、「ソケット」ごとに「ソケットごとのコア」を複数設定する必要があります。また、正規表現を使用します。
Aleksandr Dubinsky

1
「OS.indexOf()」の代わりに「OS.contains()」を使用することをお勧めします。読みやすさが向上し、入力が少なくなります。
Josh Gager 2017

6

これは、CPUコアの数(およびその他の多くの情報)を確認するための追加の方法ですが、このコードには追加の依存関係が必要です。

ネイティブオペレーティングシステムおよびハードウェア情報 https://github.com/oshi/oshi

SystemInfo systemInfo = new SystemInfo();
HardwareAbstractionLayer hardwareAbstractionLayer = systemInfo.getHardware();
CentralProcessor centralProcessor = hardwareAbstractionLayer.getProcessor();

処理に使用できる論理CPUの数を取得します。

centralProcessor.getLogicalProcessorCount();

これにより、centralProcessor.getPhysicalProcessorCount()を使用できるようになります。これは、おそらく現在Javaでその情報を取得するための最良の方法です。ほぼ常に処理が必要なスレッドがあり、他のスレッドとプロセス用に明確に定義されたCPUキャパシティーの残りを残しながら開始できるそのようなスレッドの数を知りたい場合、これは計算すべき数です。に基づく。
マラマット

-3

これは、CygwinがインストールされているWindowsで動作します。

System.getenv("NUMBER_OF_PROCESSORS")


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

これが標準のWindows環境変数であるかどうか、頭の上ではわかりませんがset NUMBER_OF_PROCESSORS、Windowsのコマンドラインで動作します。
アブナサー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.