2011-01-21 57 views
308

¿Cómo puedo encontrar la cantidad de núcleos disponibles para mi aplicación desde el código Java?Encontrar el número de núcleos en Java

+2

para casi todos los intentos y propósitos "procesador de núcleo ==". –

+26

para encontrar la cantidad de núcleos que la máquina tiene físicamente es difícil usar únicamente Java. Encontrar la cantidad de núcleos que el programa Java puede usar al inicio es fácil, usando * Runtime.getRuntime(). AvailableProcessors() *. Debido a la capacidad de todos los sistemas operativos modernos principales para establecer la afinidad de la CPU (es decir, restringir una aplicación a solo un cierto número de núcleos), esta es una preocupación a tener en cuenta. – SyntaxT3rr0r

+4

Núcleos lógicos o físicos? Hay una diferencia importante –

Respuesta

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

Si cores es menor que uno, ya sea su procesador está a punto de morir, o la JVM tiene un grave error en ella, o el universo está a punto de estallar.

+0

No hay problema, ya que la mayoría de la información recopilada de la clase 'Runtime' es a String, pensé que sería útil mostrar que este devuelve un 'int'. –

+77

Esto le dará la cantidad de hilos lógicos. p.ej. Si tiene hyper-threading activado, este será el doble del número de núcleos. –

+4

@Peter, sí, buen punto. ¡Me sentí Rey de la colina al realizar esta acción con mi máquina i7! :) –

-2

Esto funciona en Windows con Cygwin instalado:

System.getenv("NUMBER_OF_PROCESSORS")

+0

He intentado esto pero he devuelto nulo :( – Adelin

+0

Tengo instalado Cygwin, pero esto funciona desde el shell de Windows: '' groovy -e "println System.getenv ('NUMBER_OF_PROCESSORS')" '' ' –

+0

No lo sé en la parte superior de mi cabeza si esta es una variable de entorno estándar de Windows, pero: '' 'establecer NUMBER_OF_PROCESSORS''' funciona desde la línea de comandos de Windows para mí. –

12

Si desea obtener el número de núcleos físicos que se pueden ejecutar comandos cmd y de la terminal y luego a analizar la salida para obtener información que necesita. A continuación se muestra la función que devuelve el número de núcleos físicos.

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

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

}

+1

Este es un código que es un buen candidato para ser OOPed. :) –

+1

La clase OSValidator es compatible con OSX, pero getNumberOfCores la ignora por completo. Como un aparte, https://blog.opengroup.org/2015/10/02/mac-os-x-el-capitan-achieves-unix-certification/ por lo que 'Mac' debería estar en su isUnix() pero ... Para BSD, OSX, no existe ningún comando lscpu y su getNumberOfCores devolverá 0. –

+1

En Linux, debe multiplicar "Core (s) por socket" por "Socket (s)". Además, usaría expresiones regulares. –

Cuestiones relacionadas