Java определить количество ядер

Поиск количества ядер в Java

Как я могу найти количество ядер, доступных для моего приложения, из Java-кода?

ОТВЕТЫ

Ответ 1

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

Если cores меньше единицы, либо ваш процессор вот-вот умрет, либо ваша JVM имеет серьезную ошибку, либо вселенная вот-вот взорвется.

Ответ 2

Если вы хотите получить количество физических ядер, вы можете запустить команду 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(" 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"; >> 

Ответ 3

Это работает в Windows с установленной Cygwin:

Читайте также:  Html css padding right

Источник

Нахождение количества ядер в Java

найти количество ядер, которые физически имеет машина, сложно, используя чисто Java. Найти количество ядер, которые Java-программа может использовать при запуске, легко, используя Runtime.getRuntime (). AvailableProcessors () . Из-за способности всех основных современных операционных систем устанавливать привязку к процессору (т.е. ограничивать приложение только определенным числом ядер), об этом следует помнить.

3 ответа

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

Если cores меньше единицы, либо ваш процессор вот-вот умрет, либо ваша JVM имеет серьезную ошибку, либо вселенная вот-вот взорвется.

Нет проблем, так как большая часть информации, полученной из класса Runtime является String, я подумал, что было бы полезно показать, что эта функция возвращает int .

Это даст вам количество логических потоков. Например, если у вас включена гиперпоточность, количество ядер будет удвоено.

@Peter Питер, да, хорошая мысль. Я чувствовал себя королем горы, когда выполнял это действие с моей машиной i7! 🙂

@Peter Lawrey: он дает только количество логических потоков, фактически доступных для JVM (я думаю, при запуске). Используя привязку к процессору, пользователь / ОС может ограничить количество «ядер», которые видит JVM. Вы даже можете сделать это на работающей JVM, но я не слишком уверен, как это повлияет на availableProcessors () .

@SyntaxT3rr0r SyntaxT3rr0r Я подозреваю, что доступные процессоры не меняются в зависимости от сродства.

@PeterLawrey: это кажется неправильным, в документации Java для availableProcessors () написано: «Это значение может измениться во время определенного вызова виртуальной машины. Поэтому приложения, чувствительные к числу доступных процессоров, должны периодически опрашивать это свойство и корректировать их. использование ресурсов надлежащим образом. » источник

@JW Вы могли бы быть правы, я никогда не видел, чтобы кто-то раньше изменял количество виртуальных процессоров в работающей производственной системе. 😉 Я склонен работать только на реальных машинах, которые не меняются.

@universe Вселенная взорвалась и все такое: или на самом деле на машине доступно более 2 147 483 647 логических потоков? 😉

@PierreHenry Хорошо, это был бы день, когда мы могли бы решить все проблемы NP за время P для N

@PeterLawrey, я могу подтвердить, что в Windows 7 SP1 x64 с Java 1.7.0_51, availableProcessors () изменяется со сродством. Вы можете легко проверить это с помощью jrunscript, чтобы вызвать java.lang.Runtime.getRuntime (). AvailableProcessors (), изменить привязку процессора к jrunscript.exe с помощью диспетчера задач Windows, а затем снова запустить availableProcessors (), вы увидите число изменится.

На самом деле, я бы сказал, что если число доступных процессоров меньше одного, то вселенная, вероятно, уже замерла и не стоит беспокоиться.

@PeterLawrey Реальные машины также могут получать или терять ЦП. Я использую горячие процессоры (и оперативную память) на высокопроизводительных серверах двумя собственными руками.

Если вы хотите получить количество физических ядер, вы можете запустить команду 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(" prettyprint-override">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"; >> 

Класс OSValidator поддерживает OSX, но getNumberOfCores полностью игнорирует его. Кроме того, blog.opengroup.org/2015/10/02/…, поэтому в вашем isUnix () должно быть указано «Mac», но . Для BSD, OSX, команда lscpu не существует, и ваш getNumberOfCores вернет 0.

В Linux вам нужно несколько «Core (s) на сокет» на «Socket (s)». Также я бы использовал регулярные выражения.

Лучше использовать «OS.contains ()» вместо «OS.indexOf ()». Это улучшает читаемость и меньше печатать.

Источник

Есть ли в Java способ узнать, сколько процессоров (или ядер) установлено?

Я хочу сделать некоторую настройку для многопоточной программы. Если я знаю, сколько потоков действительно может работать параллельно, я могу сделать программу более эффективной. Есть ли способ в Java получить эту информацию?

5 ответов

Runtime.getRuntime().availableProcessors() 

Но его более полное предположение и даже упомянутое API

Это значение может изменяться во время конкретного вызова виртуального машина. Приложения, чувствительные к числу доступных поэтому процессоры должны периодически опробовать это свойство и настроить их использование ресурсов соответствующим образом.

+1 - Примечание: это не говорит приложению, сколько процессоров / ядер установлено . Но это говорит о том, сколько доступно для JVM . что действительно нужно OP.

@Stephen C: да, мне нужно именно это. Но не могли бы вы немного просветить меня: когда возможно, что не все процессоры доступны для JVM?

@Roman: Я полагаю, что когда ОС зарезервирует некоторые ядра / процессоры для какого-то другого процесса, они не будут доступны для JVM.

Одна заметка о методе доступныхпроцессоров(), в нем не проводится различие между физическим процессором и виртуальным процессором. например, если на вашем компьютере включена гиперпоточность, число будет в два раза больше физического процессора (что немного расстраивает). к сожалению, нет способа определить реальный vs. virtual cpus в чистой java.

Источник

Нахождение количества ядер в Java

Как узнать количество ядер, доступных для моего приложения, из кода Java?

найти количество ядер, которые физически имеет машина, сложно, используя только Java. Найти количество ядер, которые Java-программа может использовать при запуске, легко, используя Runtime.getRuntime (). AvailableProcessors () . Из-за способности всех основных современных ОС устанавливать привязку к процессору (то есть ограничивать приложение только определенным числом ядер), об этом следует помнить.

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

Если значение cores меньше единицы, ваш процессор собирается умереть, или у вашей JVM есть серьезная ошибка, или вселенная собирается взорваться.

Это даст вам количество логических потоков. Например, если у вас включена гиперпоточность, количество ядер будет удвоено.

@ Питер, да, хорошая мысль. Я чувствовал себя королем горы, когда выполнял это действие с моей машиной i7! 🙂

@Peter Lawrey: он дает только количество логических потоков, фактически доступных для JVM (я думаю, при запуске). Используя привязку к процессору, пользователь / ОС может ограничить количество «ядер», которые видит JVM. Вы даже можете сделать это на работающей JVM, но я не слишком уверен, как это влияет на availableProcessors () .

@PeterLawrey: это кажется неправильным, в документации Java для availableProcessors () говорится: «Это значение может изменяться во время определенного вызова виртуальной машины. Поэтому приложения, чувствительные к числу доступных процессоров, должны периодически опрашивать это свойство и корректировать их. использование ресурсов надлежащим образом. " Источник

@ Вселенная взорвалась и все такое: или на самом деле на машине доступно более 2 147 483 647 логических потоков? 😉

Если вы хотите получить количество физических ядер, вы можете запустить 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(" pun">)[1]); > > > > catch (IOException e)  e.printStackTrace(); > if(osValidator.isUnix()) return numberOfCores * sockets; > return numberOfCores; >
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"; > >

Источник

Оцените статью