Поиск количества ядер в 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:
Нахождение количества ядер в 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"; > >