Настройки GC для однопоточного приложения

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

Мне было интересно, есть ли конфигурации сборщика мусора, которые могут использовать преимущества однопоточного приложения?

Прямо сейчас я использую параметры UseConcMarkSweepGC, incrementalMode GC в сборке среды выполнения Java: Java 1.6.0_22-b04

2 ответа

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

Но JVM по своей природе является многопоточным, даже если у вас есть только один поток, есть другие потоки, поддерживающие JVM.

Таким образом, ответ - нет, алгоритм GC не оптимизирован для однопоточных приложений.

Стратегии GC зависят не от того, как вы кодировали свое приложение, а от того, какое у вас оборудование.

Например, если у вас есть только один доступный процессор, вам не следует включать CMS по двум причинам:

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

В этом случае вам следует включить SerialGC (или ParallelGC, это не имеет значения на компьютере с одним процессором).

Теперь, если у вас есть N ядра доступны, но ваше приложение использует только одно, вы можете установить -XX:ConcGCThreads=N-1 а также -XX:ParallelGCThreads=N-1 (в зависимости от используемого GC), чтобы JVM в полной мере использовала ваше оборудование.

Обратите внимание, что перед установкой любого флага, вы должны включить журналы GC, используя -Xloggc:gc.log -XX:+PrintGCDetails и проверяйте после каждой новой конфигурации, что она улучшает время отклика вашего приложения / пропускную способность.

Источник: http://jvm-options.tech.xebia.fr/

Другие вопросы по тегам