воскресенье, 20 марта 2016 г.

JVM параметры для тонкой настройки сборщика мусора

Совсем недавно столкнулся с необходимостью уменьшения паузы "stop world" во время сборки мусора. Во время копания в данном вопросе, открыл для себя множество интересных параметров jvm. Чтобы знания не потерялись, решил зафиксировать их в табличку.

область применения раздел название описание
память общие -Xms<size>[k|m|G] исходный размер кучи
-Xmx<size>[k|m|G] максимальный размер кучи
-Xss<size>[k|m|G] размер стека вызовов метода
-XX:NewRatio=<N> соотношение old generation (tenured) к new generation
-XX:MinHeapFreeRatio=<N> минимальное соотношение свободного пространства для уменьшения размера размера поколения
-XX:MaxHeapFreeRatio=<N> максимальное соотношение свободного пространства для увеличение размера размера поколения
молодое поколение -Xmn<size>[k|m|G] размер молодого поколения
-XX:NewSize=<size>[k|m|G] нижняя граница для молодого поколения
-XX:MaxNewSize=<size>[k|m|G] верхняя граница для молодого поколения
-XX:SurvivorRatio=<N> соотношение eden / ( survivor * 2)
-XX:YoungGenerationSizeIncrement=<N> процент увеличения молодого поколения
старое поколение -XX:TenuredGenerationSizeIncrement=<N> процент увеличение старого поколения
область метаданных -XX:MaxMetaspaceSize=<size>[k|m|G] размер метаобласти
-XX:+CMSClassUnloadingEnabled удаление неиспользуемых классов
сборка мусора общие -XX:+ScavengeBeforeFullGC перед Full GC запуск GC на young generation
-XX:+CMSScavengeBeforeRemark перед фазой remark запуск GC на young generation
-XX:-DisableExplicitGC выключаем System.gc()
-XX:CMSInitiatingOccupancyFraction=<N> порог заполненности Tenured когда запускается GC
-XX:InitiatingHeapOccupancyPercent=<N> порог заполненности heap для запуска фазы mark
-XX:GCHeapFreeLimit=<N> отключаем лимит в 2% свободной памяти после выполнения full gc перед возникновением OutOfMemoryError
-XX:-UseGCOverheadFreeLimit отключаем лимит в 98% активности GC от времени работы приложение при котором возникает OutOfMemoryError
-XX:GCTimeLimit=<N> выставляем порог для сборки мусора от общего времени выполнения приложения, если он превышен и не выставлен предыдущий флаг, то возникает OutOfMemoryError
Serial GC -XX:+UseSerialGC включаем Serial GC
Parallel GC -XX:+UseParallelGC включаем Parallel GC
-XX:MaxGCPauseMillis=<N> максимальное время пауз при сборке
-XX:GCTimeRatio=<N> процент времени выполнения GC = 1/(1+N) от общее времени работы приложения
Concurrent Mark and Swap -XX:+UseConcMarkSweepGC включаем Concurrent Mark and Swap GC
-XX:+UseParNewGC параллельное выполнение молодых сборок
-XX:+UseParNewGC параллельное выполнение молодых сборок
-XX:ParallelGCThreads=<N> количество потоков, используемые при фазе параллельной сборке мусора
-XX:ConcGCThreads=<N> количество потоков, используемых для сборки мусора
-XX:+CMSScavengeBeforeRemark запуск фазы remark после сборки на new generation
-XX:CMSWaitDuration запуск GC на tenured только после сборки на new generation
Garbage First -XX:+UseG1GC включает сборщик мусора G1
-XX:MaxGCPauseMillis=<N> Указывает G1, что в ходе отдельно взятой сборки необходимо избегать пауз дольше N мс
-XX:GCPauseIntervalMillis=<N> Указывает G1, что между сборками мусора должно проходить не менее N мс
-XX:G1HeapRegionSize=<size>[k|m|G] размер региона
-XX:ParallelGCThreads=<N> аналогично тому, что в CMS
-XX:ConcGCThreads=<N>
логирование GC -verbose:gc включение логирования для GC
-Xloggc:<filename> запись логов в файл
-XX:+UseGCLogFileRotation> разбиение файлов
-XX:+HeapDumpBeforeFullGC создание dump'а памяти перед каждым запуском полной сборки мусора
-XX:NumberOfGCLogFiles=<N> количество лог файлов
-XX:+PrintGCDetails дает расширенные подробности о сборщике мусора
-XX:+PrintGCDateStamps сопровождает операции сборщика мусора метками времени
-XX:+PrintGCApplicationConcurrentTime время, затраченное на сборщик мусора в условиях, когда потоки приложения продолжают работать
-XX:+PrintGCApplicationStoppedTime время затраченное на фазу stop the world
разное -XX:+PrintFlagsFinal отображение опций jvm, с которыми она была запущена
-XX:+HeapDumpOnOutOfMemoryError дамп при падении на OutOfMemoryError
-XX:HeapDumpPath=dump.hprof
-XX:+CompileThreshold=<N> количество запуска метода после которого происходит JIT оптимизация
-XX:+UseCompressedOops уменьшение размера ссылок для экономии памяти
-XX:+OptimizeStringConcat преобразование + в StringBuilder
-XX:+PrintCompilation показывает какие методы были оптимизированы JIT
-XX:+AggressiveOpts агрессивный режим оптимизации
-XX:+UseStringCache кэширование string'ов
Программа jmap запуск jmap <pid> получение состояния памяти
ключи -heap информация о всей куче
-histo использование памяти в процентах на каждый класс
-histo:live информация о живых объектах
-dump:live,format=b,file=heap.hprof сохранение дампа в файл

*Примечание:
Структура heap'а heap = youngGeneration + oldGeneration
youngGeneration= eden + survivor * 2
SurvivorRatio = eden / (survivor * 2)