0

"Как задать количество потоков/ЦП для Java VM?"

12

Описание проблемы: Ограничение числа потоков/процессов в Java VM

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

Важно: Я не могу изменить код, так как библиотека, которую я хочу ограничить, не позволяет модифицировать исходный код. Поэтому необходимо установить жесткое ограничение на уровне виртуальной машины. (Или возможно ли установить ограничение на потоки для приложения, которое могло бы переопределять библиотеки?)

Важно 2: Цель этого ограничения - провести тест производительности, чтобы "ограничить" библиотеку, которую я хочу протестировать, и выяснить, как она будет работать при доступе к различному числу процессоров/потоков.

Спасибо!

3 ответ(ов)

0

Проблема с ограничением ЦП в JVM была решена в Java 10 и была портирована обратно в Java 8 с версии 8u191. Для установки количества используемых процессоров можно использовать следующий параметр при запуске:

-XX:ActiveProcessorCount=2

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

0

Если вы хотите запустить вашу программу с установленной "аффинностью" для Windows, вы можете использовать команду start в командной строке. Вот пример того, как это сделать:

Вместо того чтобы запускать вашу программу так:

java Test

вы можете использовать следующие команды:

  • Чтобы использовать 1 ядро, выполните:
start /affinity 1 java Test
  • Чтобы использовать 2 ядра, выполните:
start /affinity 3 java Test

Обратите внимание, что параметр аффинности должен быть в двоичном формате, где каждый бит соответствует ядру процессора. Например, если вы хотите использовать 2 ядра, битовая маска будет 11 в двоичном (что соответствует 3 в десятичной системе).

Полное руководство можно найти здесь: Ссылка на блог MSDN.

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

System.out.println(Runtime.getRuntime().availableProcessors());

Таким образом, вы сможете настроить аффинность для вашего Java-приложения в зависимости от ваших требований.

0

Как последняя мера, я мог бы установить привязку Java VM в диспетчере задач, чтобы использовать только 1 (или несколько) ЦП. (конечно, это всё равно позволит использовать несколько потоков на 1 ЦП, но, вероятно, это ближе всего к тому, что я хотел, если у кого-то нет лучших идей).

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь