Ограничивает ли ActiveProcessorCount Java количество процессоров, которые может использовать JVM? - PullRequest
1 голос
/ 23 января 2020

Я использую Oracle Java 1.8.0_231.

Каков эффект установки -XX: ActiveProcessorCount = n? Я не C ++ парень, но я думаю, что вижу в исходном коде HotSpot эти два использования:

  • Влиять на число потоков компилятора HotSpot
  • Влиять на число G C threads

Однако действительно ли это ограничивает количество процессоров, которые может использовать JVM? В примечаниях к выпуску Java 10 прямо сказано:

Кроме того, это изменение добавляет опцию JVM, которая дает возможность указать количество процессоров, которые будет использовать JVM.

Меня беспокоит то, что у меня есть результаты тестов (вне любого контейнера Docker, CF и т. Д. c), которые, кажется, показывают приложение, использующее все 8 процессоров в равной степени вместо 4, которые у меня были set: All 8 CPUs

Итак, должна ли настройка ActiveProcessorCount фактически ограничивать количество процессоров, которые использует JVM? Я не вижу ничего в коде HotSpot, который делает это, и мои результаты теста, кажется, также говорят нет.

спасибо

Ответы [ 2 ]

3 голосов
/ 23 января 2020

Не эксперт, но интерпретирует документы как обычный Engli sh:

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

Это говорит мне о том, что оно не предназначено для ограничения использования ядра во время выполнения, а, скорее, «для вычисления размера пулов потоков [. ..]».

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

Примечания :

  1. Единственная версия документов, которую я нашел, предназначена для Java 11, так что радикально ли она изменилась между v. 8, 10 и 11 может быть открыт для интерпретации (читай: я понятия не имею).
  2. Кроме того, примечания к выпуску java 10 , о которых вы упомянули, говорят мне, что опция может быть недоступна вообще в Java 8, следовательно, принимая нет эффекта.
1 голос
/ 20 апреля 2020

Чтобы дополнить другой ответ Меной и доказать комментарий Каямана, прямой эффект этого параметра состоит в установке значения, возвращаемого Runtime.getRuntime().availableProcessors().

Чтобы доказать это, я создал класс

public class Main {
    public static void main(String[] args) {
        System.out.println("Runtime.getRuntime().availableProcessors() = " +
                Runtime.getRuntime().availableProcessors());
    }
}

Затем я скомпилировал и запустил его с помощью Java 11 на 12-ядерном компьютере с некоторыми другими параметрами:

# Show the version of Java in use
$ java -version
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+10)
OpenJDK 64-Bit Server VM (build 11.0.6+10, mixed mode)

# Run with defaults
$ java -cp . Main
Runtime.getRuntime().availableProcessors() = 12

# Run with limit lower than actual number of cores
$ java -XX:ActiveProcessorCount=4 -cp . Main 
Runtime.getRuntime().availableProcessors() = 4

# Run with limit higher than actual number of cores
$ java -XX:ActiveProcessorCount=20 -cp . Main 
Runtime.getRuntime().availableProcessors() = 20

Это также работало в последней версии Java 8 в частности, OpenJDK 1.8.0_242-b08.

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

...