Tìm số lượng lõi trong Java


411

Làm cách nào tôi có thể tìm thấy số lõi có sẵn cho ứng dụng của mình từ bên trong mã Java?


3
Đối với khá nhiều ý định và mục đích "core == bộ xử lý".
Joachim Sauer

32
việc tìm kiếm số lượng lõi mà máy thực sự khó sử dụng hoàn toàn bằng Java. Việc tìm kiếm số lượng lõi mà chương trình Java có thể sử dụng khi khởi động rất dễ dàng, sử dụng Runtime.getR.78 (). AvailableProcessors () . Do khả năng của tất cả các HĐH hiện đại chính có thể thiết lập mối quan hệ CPU (nghĩa là hạn chế một ứng dụng chỉ ở một số lõi nhất định), đây là một vấn đề cần lưu ý.
Cú phápT3rr0r

6
Lõi logic hay vật lý? Có một sự khác biệt quan trọng.
b1nary.atr0phy

Câu trả lời:


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

Nếu coresít hơn một, bộ xử lý của bạn sắp chết hoặc JVM của bạn có lỗi nghiêm trọng hoặc vũ trụ sắp nổ tung.


106
Điều này sẽ cung cấp cho bạn số lượng các chủ đề hợp lý. ví dụ: Nếu bạn có siêu phân luồng trên, con số này sẽ gấp đôi số lõi.
Peter Lawrey

6
@Peter, vâng, điểm tốt. Tôi cảm thấy mình là Vua đồi khi thực hiện hành động này với máy i7 của mình! :)
Bart Kiers

14
@Peter Lawrey: nó chỉ đưa ra số lượng các luồng logic thực sự có sẵn cho JVM (lúc khởi động tôi đoán). Sử dụng mối quan hệ CPU, người dùng / HĐH có thể hạn chế số lượng "lõi" mà JVM nhìn thấy. Bạn thậm chí có thể làm điều đó trên một JVM đang chạy nhưng tôi không chắc chắn mức độ ảnh hưởng của bộ xử lý có sẵn () này .
Cú phápT3rr0r

25
@PeterLawrey: dường như không chính xác, tài liệu Java dành cho các bộ xử lý có sẵn () cho biết "Giá trị này có thể thay đổi trong một lệnh gọi cụ thể của máy ảo. Do đó, các ứng dụng nhạy cảm với số lượng bộ xử lý có sẵn nên thỉnh thoảng thăm dò thuộc tính này và điều chỉnh thuộc tính của chúng sử dụng tài nguyên một cách thích hợp. " nguồn
JW.

9
@universe nổ tung và như vậy: hoặc máy thực sự có hơn 2.147.483.647 luồng logic có sẵn? ;)
Pierre Henry

26

Nếu bạn muốn lấy số lõi vật lý, bạn có thể chạy lệnh cmd và terminal và sau đó phân tích đầu ra để lấy thông tin bạn cần. Hàm được hiển thị là hàm trả về số lõi vật lý.

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

Lớp 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
Đây là một đoạn mã là một ứng cử viên tốt để được OOPed. :)
Lyubomyr Shaydariv

1
Lớp OSValidator hỗ trợ OSX, nhưng getNumberOfCores hoàn toàn bỏ qua nó. Bên cạnh đó, blog.opengroup.org/2015/10/02/ 'vì vậy' Mac 'nên có trong isUnix () nhưng ... Đối với BSD, OSX, không có lệnh lscpu nào tồn tại và getNumberOfCores của bạn sẽ trả về 0.
Paul Hargreaves

1
Trên Linux, bạn phải có nhiều "Lõi (mỗi) ổ cắm" bằng "Ổ cắm (s)". Ngoài ra, tôi sẽ sử dụng các biểu thức thông thường.
Alexanderr Dubinsky

1
Tốt hơn hết là sử dụng "OS.contains ()" thay vì "OS.indexOf ()". Nó cải thiện khả năng đọc và ít gõ.
Josh Gager

6

Đây là một cách bổ sung để tìm ra số lượng lõi CPU (và rất nhiều thông tin khác), nhưng mã này yêu cầu một sự phụ thuộc bổ sung:

Thông tin phần cứng và hệ điều hành gốc https://github.com/oshi/oshi

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

Lấy số lượng CPU logic có sẵn để xử lý:

centralProcessor.getLogicalProcessorCount();

Điều này cũng sẽ cho phép bạn sử dụng CentralProcessor.getPhysicalProcessorCount (), đây có lẽ là cách tốt nhất trong java để có được thông tin đó. Nếu bạn có các luồng mà hầu như liên tục có công việc phải làm và bạn muốn biết số lượng các luồng đó bạn có thể bắt đầu trong khi vẫn để lại dung lượng CPU còn lại được xác định rõ cho các luồng và quy trình khác, thì đây là số cần tính toán dựa trên.
malamut

-3

Điều này hoạt động trên Windows với Cygwin được cài đặt:

System.getenv("NUMBER_OF_PROCESSORS")


Tôi đã cài đặt Cygwin, nhưng tính năng này hoạt động từ trình vỏ Windows:groovy -e "println System.getenv('NUMBER_OF_PROCESSORS')"
AbuNassar

Tôi không biết trên đỉnh đầu của mình nếu đây là biến môi trường Windows tiêu chuẩn, nhưng: set NUMBER_OF_PROCESSORShoạt động từ dòng lệnh Windows cho tôi.
AbuNassar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.