जावा में करोड़ों की संख्या का पता लगाना


411

मैं जावा कोड के भीतर अपने आवेदन के लिए उपलब्ध कोर की संख्या कैसे पा सकता हूं?


3
बहुत सारे इरादों और उद्देश्य के लिए "कोर == प्रोसेसर"।
जोआचिम सॉयर

32
मशीन के भौतिक रूप से शुद्ध जावा का उपयोग करके कोर की संख्या का पता लगाना कठिन है। स्टार्टअप पर उपयोग किए जा सकने वाले जावा प्रोग्राम की कोर की संख्या को खोजना आसान है, Runtime.getRuntime (); availableProcessors () का उपयोग करके । सीपीयू आत्मीयता स्थापित करने के लिए सभी प्रमुख आधुनिक ओएस की क्षमता के कारण (यानी एक आवेदन केवल कोर की एक निश्चित संख्या तक सीमित है) यह ध्यान में रखना एक चिंता का विषय है।
SyntaxT3rr0r

6
तार्किक या शारीरिक कोर? एक महत्वपूर्ण अंतर है।
b1nary.atr0phy

जवाबों:


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

अगर cores एक से कम है, तो या तो आपका प्रोसेसर मरने वाला है, या आपके JVM में एक गंभीर बग है, या ब्रह्मांड उड़ने वाला है।


106
यह आपको तार्किक धागे की संख्या देगा। उदा। यदि आपके पास हाइपर-थ्रेडिंग है, तो यह कोर की संख्या से दोगुना होगा।
पीटर लॉरी

6
@ पेटर, हाँ, अच्छी बात है। जब मैं अपने i7 मशीन के साथ इस क्रिया को कर रहा था तो मैंने खुद को किंग ऑफ द हिल महसूस किया! :)
बार्ट कीर्स

14
@Peter Lawrey: यह केवल JVM (स्टार्टअप पर मुझे लगता है) के लिए उपलब्ध तार्किक थ्रेड्स की संख्या देता है। सीपीयू आत्मीयता का उपयोग करते हुए उपयोगकर्ता / ओएस एक जेवीएम देखता है "कोर" की संख्या को प्रतिबंधित कर सकता है। आप इसे एक रनिंग जेवीएम पर भी कर सकते हैं लेकिन मुझे यकीन नहीं है कि यह कैसे उपलब्धप्रोसेसर () को प्रभावित करता है
SyntaxT3rr0r

25
@PeterLawrey: यह गलत प्रतीत होता है, availableProcessors () के लिए जावा डॉक्यूमेंटेशन कहता है, "वर्चुअल मशीन के किसी विशेष आह्वान के दौरान यह मान बदल सकता है। ऐसे एप्लिकेशन जो उपलब्ध प्रोसेसर की संख्या के प्रति संवेदनशील होते हैं, इसलिए कभी-कभी इस प्रॉपर्टी को पोल करना चाहिए और उन्हें समायोजित करना चाहिए। संसाधनों का उचित उपयोग। ” सोर्स
JW

9
@universe उड़ाने और इस तरह: या मशीन वास्तव में 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
यह कोड का एक टुकड़ा है जो OOPed होने के लिए एक अच्छा उम्मीदवार है। :)
शमोमिर शैडैरिव

1
OSValidator वर्ग OSX का समर्थन करता है, लेकिन getNumberOfCores इसे पूरी तरह से अनदेखा करता है। एक तरफ के रूप में, blog.opengroup.org/2015/10/02/… तो 'मैक' आपके isUnix () में होना चाहिए लेकिन ... BSD, OSX के लिए, कोई lscpu कमांड मौजूद नहीं है और आपका getNumberOfCores 0. वापस आ जाएगा
पॉल हरग्रेव्स

1
लिनक्स पर, आपको "सॉकेट (ओं)" द्वारा एकाधिक "कोर (एस) प्रति सॉकेट" करना होगा। इसके अलावा, मैं नियमित अभिव्यक्ति का उपयोग करूंगा।
हांग्जो डबिन्स्की

1
"OS.indexOf ()" के बजाय "OS.contains ()" का उपयोग करना बेहतर है। यह पठनीयता में सुधार करता है और टाइप करने के लिए कम है।
जोश गेजर

6

यह सीपीयू कोर की संख्या (और बहुत सारी अन्य जानकारी) का पता लगाने का एक अतिरिक्त तरीका है, लेकिन इस कोड के लिए अतिरिक्त निर्भरता की आवश्यकता है:

नेटिव ऑपरेटिंग सिस्टम और हार्डवेयर जानकारी https://github.com/oshi/oshi

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

प्रसंस्करण के लिए उपलब्ध तार्किक सीपीयू की संख्या प्राप्त करें:

centralProcessor.getLogicalProcessorCount();

यह आपको CentralProcessor.getPhysicalProcessorCount () का उपयोग करने देगा, जो कि वर्तमान में जावा में उस जानकारी को प्राप्त करने का सबसे अच्छा तरीका है। यदि आपके पास थ्रेड्स हैं, जो लगभग लगातार काम करने के लिए हैं, और आप ऐसे थ्रेड्स की संख्या जानना चाहते हैं जो आप अभी भी अन्य थ्रेड्स और प्रक्रियाओं के लिए सीपीयू क्षमता के एक अच्छी तरह से परिभाषित बचे हुए हिस्से को छोड़ सकते हैं, यह वह संख्या है जो गणना होनी चाहिए पर आधारित।
मलामत

-3

यह सिगविन के साथ विंडोज पर काम करता है:

System.getenv("NUMBER_OF_PROCESSORS")


मेरे पास साइगविन स्थापित है, लेकिन यह विंडोज शेल से काम करता है:groovy -e "println System.getenv('NUMBER_OF_PROCESSORS')"
अबूझार

अगर यह एक मानक विंडोज पर्यावरण चर है, तो मैं अपने सिर के ऊपर से नहीं जानता, लेकिन: set NUMBER_OF_PROCESSORSमेरे लिए विंडोज कमांड लाइन से काम करता है।
अबूनासर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.