Java'daki Çekirdek Sayısını Bulma


411

Uygulamam için kullanılabilir çekirdek sayısını Java kodundan nasıl bulabilirim?


3
Hemen hemen tüm niyet ve amaç için "core == işlemci".
Joachim Sauer

32
makinenin fiziksel olarak sahip olduğu çekirdek sayısını bulmak tamamen Java kullanarak zordur. Java programının Runtime.getRuntime (). AvailableProcessors () kullanarak başlangıçta kullanabileceği çekirdek sayısını bulmak kolaydır . Tüm büyük modern işletim sistemlerinin CPU benzeşimini ayarlayabilmesinden dolayı (yani bir uygulamayı yalnızca belirli sayıda çekirdekle sınırlamak) bu akılda tutulması gereken bir husustur.
SyntaxT3rr0r

6
Mantıksal mı fiziksel mi? Önemli bir fark var.
b1nary.atr0phy

Yanıtlar:


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

Birden coresküçükse, ya işlemciniz ölmek üzeredir ya da JVM'nizde ciddi bir hata vardır ya da evren patlamak üzeredir.


106
Bu size mantıksal iş parçacıklarının sayısını verecektir. Örneğin, hiper iş parçacığına sahipseniz, bu çekirdek sayısının iki katı olacaktır.
Peter Lawrey

6
@Peter, evet, iyi bir nokta. İ7 makinemle bu eylemi yaparken kendimi Tepenin Kralı hissettim! :)
Bart Kiers

14
@Peter Lawrey: sadece JVM için mevcut olan mantıksal iş parçacıklarının sayısını verir (başlangıçta sanırım). CPU benzeşimini kullanarak kullanıcı / işletim sistemi bir JVM'nin gördüğü "çekirdek" sayısını kısıtlayabilir. Hatta çalışan bir JVM bile yapabilirsiniz ama bu nasıl availableProcessors () etkisi nasıl emin değilim .
SyntaxT3rr0r

25
@PeterLawrey: yanlış gibi görünüyor, availableProcessors () için Java belgeleri "Bu değer sanal makinenin belirli bir çağrılması sırasında değişebilir. Bu nedenle, kullanılabilir işlemci sayısına duyarlı uygulamalar zaman zaman bu özelliği yoklamalı ve kaynak kullanımı uygun şekilde. " kaynak
JW.

9
@universe havaya uçuyor ve böyle: veya makinede aslında 2.147.483.647'den fazla mantıksal iş parçacığı var mı? ;)
Pierre Henry

26

Fiziksel çekirdek sayısını almak istiyorsanız, cmd ve terminal komutunu çalıştırabilir ve daha sonra ihtiyacınız olan bilgiyi almak için çıktıyı ayrıştırabilirsiniz.

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 sınıfı:

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
Bu bir OOPed adayı iyi bir kod parçasıdır. :)
Lyubomyr Shaydariv

1
OSValidator sınıfı OSX'i destekler, ancak getNumberOfCores bunu tamamen yok sayar. Bir yana, blog.opengroup.org/2015/10/02/… 'Mac' isUnix'inizde () olmalı ama ... BSD, OSX için lscpu komutu yok ve getNumberOfCores'ınız 0 döndürecek.
Paul Hargreaves

1
Linux'ta, "Soket (ler)" ile birden çok "soket başına Çekirdek" i kullanmanız gerekir. Ayrıca, düzenli ifadeler kullanırdım.
Aleksandr Dubinsky

1
"OS.indexOf ()" yerine "OS.contains ()" kullanmak daha iyidir. Okunabilirliği artırır ve yazması daha azdır.
Josh Gager

6

Bu, CPU çekirdeği sayısını (ve diğer birçok bilgiyi) bulmanın ek bir yoludur, ancak bu kod ek bir bağımlılık gerektirir:

Yerel İşletim Sistemi ve Donanım Bilgileri https://github.com/oshi/oshi

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

İşleme alınabilecek mantıksal CPU sayısını elde edin:

centralProcessor.getLogicalProcessorCount();

Bu ayrıca şu anda java'da bu bilgileri elde etmenin en iyi yolu olan centralProcessor.getPhysicalProcessorCount () yöntemini kullanmanıza izin verir. Neredeyse sürekli iş yapacak iş parçacıklarınız varsa ve diğer iş parçacıkları ve işlemler için iyi tanımlanmış bir CPU kapasitesi kalan bırakırken başlayabileceğiniz bu iş parçacıklarının sayısını bilmek istiyorsanız, bu, hesaplamanın olması gereken sayıdır. dayalı.
malamut

-3

Cygwin yüklü Windows işletim sistemlerinde çalışır:

System.getenv("NUMBER_OF_PROCESSORS")


Cygwin yükledim, ancak bu Windows kabuğundan çalışıyor:groovy -e "println System.getenv('NUMBER_OF_PROCESSORS')"
AbuNassar

Bu standart bir Windows ortam değişkeni ise başımın üstünü bilmiyorum, ama: set NUMBER_OF_PROCESSORSbenim için Windows komut satırından çalışıyor.
AbuNassar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.