Руководство по наиболее важным параметрам JVM

Руководство по наиболее важным параметрам JVM

1. обзор

В этом кратком руководстве мы рассмотрим наиболее известные параметры, которые можно использовать для настройки виртуальной машины Java.

2. Явная память кучи - параметры Xms и Xmx

Одним из наиболее распространенных методов, связанных с производительностью, является инициализация динамической памяти в соответствии с требованиями приложения.

Поэтому мы должны указать минимальный и максимальный размер кучи. Для достижения этой цели можно использовать следующие параметры:

-Xms[unit]
-Xmx[unit]

Здесьunit обозначает устройство, в котором память (обозначеннаяheap size) должна быть инициализирована. Единицы могут быть отмечены как‘g' для ГБ,‘m' для МБ и‘k' для КБ.

Например, если мы хотим назначить JVM минимум 2 ГБ и максимум 5 ГБ, нам нужно написать:

-Xms2G -Xmx5G

Начиная с Java 8, размерMetaspace не определен. Как только он достигает глобального предела, JVM автоматически увеличивает его, однако, чтобы преодолеть любую ненужную нестабильность, мы можем установить размерMetaspace с помощью:

-XX:MaxMetaspaceSize=[unit]

Здесьmetaspace size обозначает объем памяти, который мы хотим назначитьMetaspace.

Что касаетсяOracle guidelines, после общего объема доступной памяти вторым по значимости фактором является доля кучи, зарезервированная для молодого поколения. По умолчанию минимальный размер YG составляет 1310MB, а максимальный размер -unlimited.

Мы можем назначить их явно:

-XX:NewSize=[unit]
-XX:MaxNewSize=[unit]

3. Вывоз мусора

Для лучшей стабильности приложения выбор правильного алгоритмаGarbage Collection имеет решающее значение.

JVM имеет четыре типа реализацийGC:

  • Серийный сборщик мусора

  • Параллельный сборщик мусора

  • CMS Сборщик мусора

  • G1 Сборщик мусора

Эти реализации могут быть объявлены с помощью следующих параметров:

-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC

Более подробную информацию о реализацияхGarbage Collection можно найти вhere.

4. Журнал GC

Чтобы строго контролировать работоспособность приложения, мы всегда должны проверять производительность JVMGarbage Collection. Самый простой способ сделать это - зарегистрировать активностьGC в удобочитаемом формате.

Используя следующие параметры, мы можем зарегистрировать активностьGC:

-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=< number of log files >
-XX:GCLogFileSize=< file size >[ unit ]
-Xloggc:/path/to/gc.log

UseGCLogFileRotation определяет политику прокрутки файла журнала, как log4j, s4lj и т. д. NumberOfGCLogFiles обозначает максимальное количество файлов журнала, которое может быть записано за один жизненный цикл приложения. GCLogFileSize указывает максимальный размер файла. Наконец,loggc обозначает его местоположение.

Следует отметить, что есть еще два доступных параметра JVM (-XX:+PrintGCTimeStamps и-XX:+PrintGCDateStamps), которые можно использовать для печати метки времени с указанием даты в журналеGC.

Например, если мы хотим назначить не более 100GCфайлов журнала, каждый из которых имеет максимальный размер 50 МБ, и хотим сохранить их в папке «/home/user/log/'», мы можем использовать следующий синтаксис:

-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=50M
-Xloggc:/home/user/log/gc.log

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

5. Обработка нехватки памяти

Очень часто большие приложения сталкиваются сout of memory error, что, в свою очередь, приводит к сбою приложения. Это очень важный сценарий, и его очень сложно воспроизвести для устранения проблемы.

Вот почему JVM поставляется с некоторыми параметрами, которые выгружают динамическую память в физический файл, который позже можно использовать для обнаружения утечек:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid.hprof
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
-XX:+UseGCOverheadLimit

Здесь нужно отметить пару моментов:

  • HeapDumpOnOutOfMemoryError инструктирует JVM сбрасывать кучу в физический файл в случаеOutOfMemoryError

  • HeapDumpPath обозначает путь, по которому файл должен быть записан; можно указать любое имя файла; однако, если JVM находит тег<pid> в имени, идентификатор текущего процесса, вызывающего ошибку нехватки памяти, будет добавлен к имени файла в формате.hprof

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

-XX:OnOutOfMemoryError="shutdown -r"
  • UseGCOverheadLimit - это политика, ограничивающая долю времени виртуальной машины, которое тратится на сборщик мусора, прежде чем будет выдана ошибкаOutOfMemory.

6. 32/64 Bit

В среде ОС, в которой установлены 32- и 64-разрядные пакеты, JVM автоматически выбирает 32-разрядные пакеты среды.

Если мы хотим установить 64-битную среду вручную, мы можем сделать это, используя параметр ниже:

-d

Бит ОС может быть32 или64. Более подробную информацию об этом можно найти вhere.

7. Misc

  • -server: включает «Server Hotspot VM»; этот параметр используется по умолчанию в 64-битной JVM

  • -XX:+UseStringDeduplication:Java 8u20 представил этот параметр JVM для уменьшения ненужного использования памяти путем создания слишком большого количества экземпляров одного и того жеString;, что оптимизирует память кучи за счет уменьшения повторяющихся значенийString в один глобальный массив char []

  • -XX:+UseLWPSynchronization: устанавливает политику синхронизации на основеLWP (Light Weight Process) вместо синхронизации на основе потоков

  • -XX:LargePageSizeInBytes: устанавливает большой размер страницы, используемый для кучи Java; принимает аргумент в ГБ / МБ / КБ; с большими размерами страниц мы можем лучше использовать аппаратные ресурсы виртуальной памяти; однако это может привести к увеличению размера пространства дляPermGen, что, в свою очередь, может привести к уменьшению размера пространства кучи Java.

  • -XX:MaxHeapFreeRatio: устанавливает максимальный процент свободной кучи послеGC, чтобы избежать сжатия.

  • -XX:MinHeapFreeRatio: устанавливает минимальный процент свободной кучи послеGC, чтобы избежать расширения; для мониторинга использования кучи вы можете использоватьVisualVM, поставляемый с JDK.

  • -XX:SurvivorRatio: соотношениеeden /survivor space size - например,-XX:SurvivorRatio=6 устанавливает соотношение между каждымsurvivor space иeden space равным 1: 6,

  • -XX:+UseLargePages: использовать большую страничную память, если она поддерживается системой; обратите внимание, чтоOpenJDK 7 имеет тенденцию к сбою при использовании этого параметра JVM **

  • -XX:+UseStringCache: включает кэширование обычно выделяемых строк, доступных в пулеString **

  • -XX:+UseCompressedStrings: используйте типbyte[] для объектовString, которые могут быть представлены в чистом формате ASCII

  • -XX:+OptimizeStringConcat: оптимизирует операции конкатенацииString, где это возможно **

8. Заключение

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

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

Если вы хотите изучить справочные параметры более подробно, вы можете начатьhere.