Java에서 코어 수 찾기


411

Java 코드 내에서 애플리케이션에 사용할 수있는 코어 수를 어떻게 찾을 수 있습니까?


3
거의 모든 의도와 목적을 위해 "core == processor".
Joachim Sauer

32
기계가 물리적으로 가지고있는 코어 수를 찾는 것은 순수한 Java를 사용하기가 어렵습니다. Runtime.getRuntime (). availableProcessors ()를 사용하면 시작시 Java 프로그램이 사용할 수있는 코어 수를 쉽게 찾을 수 있습니다 . 모든 주요 최신 OS가 CPU 선호도를 설정 (즉, 특정 수의 코어로만 응용 프로그램을 제한) 할 수 있기 때문에이 점을 염두에 두어야합니다.
SyntaxT3rr0r

6
논리 또는 물리 코어? 중요한 차이점이 있습니다.
b1nary.atr0phy 3

답변:


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

경우는 cores보다 하나입니다 중 하나를 프로세서 다이에 관한, 또는 JVM이에 심각한 버그가, 또는 우주에 대한 날려이다.


106
이것은 논리 스레드의 수를 제공합니다. 예를 들어 하이퍼 스레딩을 사용하는 경우 코어 수가 두 배가됩니다.
Peter Lawrey

6
@ 피터, 예, 좋은 지적입니다. i7 머신으로이 작업을 수행 할 때 언덕의 왕이라고 느꼈습니다! :)
Bart Kiers

14
@ Peter Lawrey : 실제로 JVM에서 사용할 수있는 논리적 스레드 수를 제공합니다 (시작시 추측합니다). CPU 선호도를 사용하여 사용자 / OS는 JVM이 보는 "코어"수를 제한 할 수 있습니다. 실행중인 JVM에서도 할 수 있지만 이것이 availableProcessors ()에 어떤 영향을 미치는지 잘 모르겠습니다 .
SyntaxT3rr0r

25
@PeterLawrey : 잘못된 것으로 보입니다. availableProcessors ()에 대한 Java 설명서는 "이 값은 특정 가상 머신 호출 중에 변경 될 수 있습니다. 사용 가능한 프로세서 수에 민감한 애플리케이션은 때때로이 특성을 폴링하고 해당 특성을 조정해야합니다. "적절한 자원 사용." 출처
JW.

9
@universe wup and etc : 또는 기계에 실제로 2,147,483,647 개 이상의 논리 스레드가 있습니까? ;)
Pierre Henry

26

많은 수의 물리적 코어를 얻으려면 cmd 및 terminal 명령을 실행 한 다음 필요한 정보를 얻기 위해 출력을 구문 분석 할 수 있습니다. 아래에 물리적 코어 수를 반환하는 함수가 표시됩니다.

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

1
OSValidator 클래스는 OSX를 지원하지만 getNumberOfCores는이를 완전히 무시합니다. 따로, blog.opengroup.org/2015/10/02/… 따라서 'Mac'은 isUnix ()에 있어야하지만 BSD, OSX의 경우 lscpu 명령이없고 getNumberOfCores가 0을 반환합니다.
Paul Hargreaves

1
Linux에서는 "소켓"별로 "소켓 당 여러 코어"를 사용해야합니다. 또한 정규 표현식을 사용합니다.
Aleksandr Dubinsky

1
"OS.indexOf ()"대신 "OS.contains ()"를 사용하는 것이 좋습니다. 가독성을 높이고 입력하기가 더 쉽습니다.
Josh Gager

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 용량을 남겨두고 시작할 수있는 스레드 수를 알고 싶다면 계산 해야하는 숫자입니다. 에 기초하여.
Malamut

-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 명령 줄에서 작동합니다.
AbuNassar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.