1. Обзор
В этом кратком руководстве мы рассмотрим наиболее известные параметры, которые можно использовать для настройки виртуальной машины Java.
2. Явная память кучи - параметры Xms и Xmx
Одна из наиболее распространенных практик, связанных с производительностью, - инициализация кучи памяти в соответствии с требованиями приложения.
Поэтому мы должны указать минимальный и максимальный размер кучи. Для этого можно использовать следующие параметры:
-Xms[unit] -Xmx[unit]
Здесь unit обозначает единицу, в которой память (обозначенная размером кучи ) должна быть инициализирована. Единицы могут быть отмечены как «g» для ГБ, «m» для МБ и «k» для КБ.
Например, если мы хотим назначить JVM минимум 2 ГБ и максимум 5 ГБ, нам нужно написать:
-Xms2G -Xmx5G
Начиная с Java 8 размер Metaspace не определен. Как только он достигает глобального предела, JVM автоматически увеличивает его, однако, чтобы преодолеть любую ненужную нестабильность, мы можем установить размер Metaspace с помощью:
-XX:MaxMetaspaceSize=[unit]
Здесь размер метапространства обозначает объем памяти, который мы хотим назначить метапространству .
Согласно рекомендациям Oracle, после общего объема доступной памяти вторым по значимости фактором является доля кучи, зарезервированная для молодого поколения. По умолчанию минимальный размер YG составляет 1310 МБ , а максимальный размер не ограничен .
Мы можем назначить их явно:
-XX:NewSize=[unit] -XX:MaxNewSize=[unit]
3. Сборка мусора
Для лучшей стабильности приложения выбор правильного алгоритма сборки мусора имеет решающее значение.
JVM имеет четыре типа реализации GC :
- Серийный сборщик мусора
- Параллельный сборщик мусора
- Сборщик мусора CMS
- Сборщик мусора G1
Эти реализации можно объявить с помощью следующих параметров:
-XX:+UseSerialGC -XX:+UseParallelGC -XX:+USeParNewGC -XX:+UseG1GC
Более подробную информацию о реализациях сборки мусора можно найти здесь.
4. Журнал ГХ
Чтобы строго контролировать работоспособность приложения, мы всегда должны проверять производительность сборки мусора JVM . Самый простой способ сделать это - зарегистрировать активность GC в удобочитаемом формате.
Используя следующие параметры, мы можем регистрировать активность GC :
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles= -XX:GCLogFileSize=[ unit ] -Xloggc:/path/to/gc.log
UseGCLogFileRotation определяет политику прокрутки файлов журнала, как и log4j, s4lj и т. Д. NumberOfGCLogFiles обозначает максимальное количество файлов журнала, которые могут быть записаны за один жизненный цикл приложения. GCLogFileSize указывает максимальный размер файла. Наконец, loggc обозначает его местоположение.
Следует отметить, что доступны еще два параметра JVM ( -XX: + PrintGCTimeStamps и -XX: + PrintGCDateStamps ), которые можно использовать для печати метки времени с указанием даты в журнале GC .
Например, если мы хотим назначить максимум 100 файлов журнала GC , каждый из которых имеет максимальный размер 50 МБ, и хотим сохранить их в папке ' / home / user / log /' , мы можем использовать синтаксис ниже:
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Xloggc:/home/user/log/gc.log
Однако проблема в том, что один дополнительный поток демона всегда используется для мониторинга системного времени в фоновом режиме. Такое поведение может создать узкое место в производительности; поэтому в продакшене с этим параметром всегда лучше не играть.
5. Обработка нехватки памяти
В больших приложениях очень часто возникает ошибка нехватки памяти, которая, в свою очередь, приводит к сбою приложения. Это очень важный сценарий, и его очень сложно воспроизвести для устранения проблемы.
Вот почему JVM поставляется с некоторыми параметрами, которые выгружают память кучи в физический файл, который можно использовать позже для обнаружения утечек:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid.hprof -XX:OnOutOfMemoryError=";" -XX:+UseGCOverheadLimit
Здесь следует отметить пару моментов:
- HeapDumpOnOutOfMemoryError предписывает JVM сбрасывать кучу в физический файл в случае OutOfMemoryError
- HeapDumpPath обозначает путь, по которому файл должен быть записан; можно указать любое имя файла; однако, если JVM найдетв имени, идентификатор текущего процесса, вызывающего ошибку нехватки памяти, будет добавлен к имени файла в формате .hprof
- OnOutOfMemoryError используется для выдачи аварийных команд, которые должны выполняться в случае ошибки нехватки памяти; правильная команда должна использоваться в пространстве аргументов cmd. Например, если мы хотим перезапустить сервер, как только произойдет нехватка памяти, мы можем установить параметр:
-XX:OnOutOfMemoryError="shutdown -r"
- UseGCOverheadLimit - это политика, которая ограничивает долю времени виртуальной машины, которое тратится на сборку мусора, до того, как выдается ошибка OutOfMemory
6. 32/64 бит
В среде ОС, где установлены как 32-разрядные, так и 64-разрядные пакеты, JVM автоматически выбирает 32-разрядные пакеты среды.
Если мы хотим установить 64-битную среду вручную, мы можем сделать это с помощью параметра ниже:
-d
Разрядность ОС может быть 32 или 64 . Более подробную информацию об этом можно найти здесь.
7. Разное
- -server : включает «Server Hotspot VM»; этот параметр используется по умолчанию в 64-битной JVM
- -XX: + UseStringDeduplication : Java 8u20 представил этот параметр JVM для уменьшения ненужного использования памяти за счет создания слишком большого количества экземпляров одной и той же String; это оптимизирует память кучи, уменьшая повторяющиесязначения String до одного глобального массива char []
- -XX: + UseLWPSynchronization : устанавливаетполитику синхронизации на основе LWP ( облегченный процесс ) вместо синхронизации на основе потоков.
- -XX: LargePageSizeInBytes : устанавливает большой размер страницы, используемый для кучи Java; принимает аргумент в ГБ / МБ / КБ; с большими размерами страниц мы можем лучше использовать аппаратные ресурсы виртуальной памяти; однако это может привести к увеличению размера пространства для PermGen , что, в свою очередь, может заставить уменьшить размер пространства кучи Java.
- -XX: MaxHeapFreeRatio : устанавливает максимальный процент кучи бесплатно после GC , чтобы избежать усадки.
- -XX: MinHeapFreeRatio : устанавливает минимальный процент кучи свободно после GC для расширения избегайте; для мониторинга использования кучи вы можете использовать VisualVM, поставляемый с JDK.
- -XX: SurvivorRatio : Отношение Идно / выжившего размер пространства - например, -XX: SurvivorRatio = 6 устанавливает соотношение между каждым выжившим пространством и Идно пространством , чтобы быть 1: 6,
- -XX: + UseLargePages : использовать большую страничную память, если она поддерживается системой; обратите внимание, что OpenJDK 7 имеет тенденцию к сбою при использовании этого параметра JVM
- -XX: + UseStringCache : включает кеширование обычно выделяемых строк, доступных впуле строк
- -XX: + UseCompressedStrings : использоватьтип byte [] дляобъектов String, которые могут быть представлены в чистом формате ASCII.
- -XX: + OptimizeStringConcat : она оптимизирует Строковые операции конкатенациигдевозможно
8. Заключение
В этой быстрой статье мы узнали о некоторых важных параметрах JVM, которые можно использовать для настройки и повышения общей производительности приложения.
Некоторые из них также можно использовать для отладки.
Если вы хотите изучить справочные параметры более подробно, вы можете начать здесь.