Menemukan Jumlah Cores di Jawa


411

Bagaimana saya bisa menemukan jumlah core yang tersedia untuk aplikasi saya dari dalam kode Java?


3
Untuk hampir semua maksud dan tujuan "inti == prosesor".
Joachim Sauer

32
menemukan jumlah core mesin secara fisik sulit menggunakan Java murni. Menemukan jumlah core yang dapat digunakan oleh program Java saat startup itu mudah, menggunakan Runtime.getRuntime (). AvailableProcessors () . Karena kemampuan semua OS modern utama untuk mengatur afinitas CPU (yaitu membatasi aplikasi hanya untuk sejumlah inti), hal ini perlu diperhatikan.
SyntaxT3rr0r

6
Inti logis atau fisik? Ada perbedaan penting.
b1nary.atr0phy

Jawaban:


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

Jika coreskurang dari satu, baik prosesor Anda akan mati, atau JVM Anda memiliki bug serius di dalamnya, atau alam semesta akan meledak.


107
Ini akan memberi Anda jumlah utas logis. mis. Jika Anda memiliki hyper-threading aktif, ini akan menjadi dua kali lipat jumlah core.
Peter Lawrey

6
@ Peter, yeah, poin bagus. Saya merasakan sendiri King of the Hill ketika melakukan tindakan ini dengan mesin i7 saya! :)
Bart Kiers

14
@Peter Lawrey: itu hanya memberikan jumlah utas logis yang sebenarnya tersedia untuk JVM (saat startup saya kira). Menggunakan afinitas CPU, pengguna / OS dapat membatasi jumlah "core" yang dilihat JVM. Anda bahkan dapat melakukannya pada JVM yang sedang berjalan tetapi saya tidak terlalu yakin bagaimana pengaruh ini tersediaProcessors () .
Sintaksis 3rr0r

25
@PeterLawrey: yang tampaknya tidak benar, dokumentasi Java untuk availableProcessors () mengatakan "Nilai ini dapat berubah selama permintaan tertentu dari mesin virtual. Aplikasi yang sensitif terhadap jumlah prosesor yang tersedia karenanya harus sesekali mengumpulkan properti ini dan menyesuaikan mereka. penggunaan sumber daya secara tepat. " sumber
JW.

9
@universe meledak dan semacamnya: atau mesin tersebut sebenarnya memiliki lebih dari 2.147.483.647 thread logis tersedia? ;)
Pierre Henry

26

Jika Anda ingin mendapatkan jumlah core fisik, Anda dapat menjalankan cmd dan terminal perintah dan kemudian mem-parsing output untuk mendapatkan info yang Anda butuhkan. Di bawah ini ditampilkan fungsi yang mengembalikan jumlah core fisik.

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

Kelas 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
Ini adalah bagian dari kode yang merupakan kandidat yang baik untuk OOP. :)
Lyubomyr Shaydariv

1
Kelas OSValidator mendukung OSX, tetapi getNumberOfCores sepenuhnya mengabaikannya. Sebagai tambahan, blog.opengroup.org/2015/10/02/... jadi 'Mac' harus ada di isUnix Anda () tetapi ... Untuk BSD, OSX, tidak ada perintah lscpu ada dan getNumberOfCores Anda akan kembali 0.
Paul Hargreaves

1
Di Linux, Anda harus mengalikan "Core (s) per soket" dengan "Socket (s)". Juga, saya akan menggunakan ekspresi reguler.
Aleksandr Dubinsky

1
Lebih baik menggunakan "OS.contains ()" daripada "OS.indexOf ()". Ini meningkatkan keterbacaan dan kurang mengetik.
Josh Gager

6

Ini adalah cara tambahan untuk mengetahui jumlah inti CPU (dan banyak informasi lainnya), tetapi kode ini memerlukan ketergantungan tambahan:

Sistem Operasi Asli dan Informasi Perangkat Keras https://github.com/oshi/oshi

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

Dapatkan jumlah CPU logis yang tersedia untuk diproses:

centralProcessor.getLogicalProcessorCount();

Ini juga akan membiarkan Anda menggunakan centralProcessor.getPhysicalProcessorCount (), yang mungkin saat ini merupakan cara terbaik di java untuk mendapatkan informasi itu. Jika Anda memiliki utas yang hampir selalu harus dikerjakan, dan Anda ingin tahu jumlah utas yang dapat Anda mulai sementara masih menyisakan sisa sisa kapasitas CPU untuk utas dan proses lainnya, ini adalah jumlah perhitungan yang seharusnya berdasarkan.
malamut

-3

Ini berfungsi pada Windows dengan Cygwin diinstal:

System.getenv("NUMBER_OF_PROCESSORS")


Saya sudah menginstal Cygwin, tetapi ini bekerja dari shell Windows:groovy -e "println System.getenv('NUMBER_OF_PROCESSORS')"
AbuNassar

Saya tidak tahu dari atas kepala saya jika ini adalah variabel lingkungan Windows standar, tetapi: set NUMBER_OF_PROCESSORSbekerja dari baris perintah Windows untuk saya.
AbuNassar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.