ВНИМАНИЕ! Для того, чтобы добиться максимальной производительности, лучше выбрать определенные аргументы, нежели вписывать все сразу.
На разных версиях Java и на разном железе – аргументы ведут себя по-разному. Так что лучше после установки аргумента каждый раз перепроверять, улучшилась производительность, или нет.
Пример строки запуска:
java -аргумент1 -аргумент2 -аргументN server.jar
Строка запуска моего сервера:
java -Xmx5G -Xmn192M -XX:+UseConcMarkSweepGC -jar server.jar
Аргументы моего клиента:
-Xmn256M
Выделение Java под конкретные ядра (только Linux)
Перед командой запуска сервера, добавьте эту команду:
taskset -c [ядра] [команда запуска]
[ядра] = 0,1,2,3 – указывать обязательно в таком формате.
Список аргументов:
Основные флаги
- -Xincgc – активирует сборщик мусора, который время-от-времени будет выгружать неиспользуемую оперативную память. Тип сборщика выбирается в зависимости от версии Java.
- -server – активирует серверную версию Java, в которой по умолчанию включена функция поддержки экспериментальных флагов, а также ускоряет компиляцию классов, что даёт прирост в производительности, но увеличивает время запуска (только 64-битные системы)
Выделение памяти
- -Xmx5G – количество максимальной выделяемой памяти под сервер
- -Xms512M – количество минимально выделяемой памяти под сервер
- -Xmn128M – количество выделяемой памяти под недолгоживущие объекты (которые не были выгружены сборщиком мусора)
- -XX:MaxPermSize=128M – количество памяти под PermGen Space (не работает на Java 8)
- -XX:SharedReadOnlySize=30M – количество памяти под read-only место в PermGen
Сборщики мусора
Это больная тема, советую экспериментировать, чтобы добиться хоть чего-то стоящего, а не наоборот, ухудшить производительность.
МИНИ-СОВЕТ: Для одноядерных процессоров используйте любой сборщик мусора, но не указывайте кол-во потоков для него. На данный момент лучшим сборщиком мусора для кубача является ConcMarkSweepGC. Чем больше число SurvivorRatio – тем лучше, тем меньше старые объекты будут захламлять ОЗУ. Чем больше TargetSurvivorRatio – тем больше старых объектов будет очищаться (желательно не ставить более 90).
Использовать MaxGCPauseMillis лучше всего с G1GC или с конкретно указанным сборщиком мусора. AutoGCSelectPauseMillis – со сборщиком, который система сама выберет. G1HeapRegionSize лучше не устанавливать, java сама подберет оптимальное значение, использовать только если знаете, что делаете.
- -XX:+UseSerialGC – включает сборщик мусора, который работает в 1 потоке
- -XX:+UseConcMarkSweepGC – включает сборщик мусора, который использует мощь нескольких процессоров.
- -XX:ConcGCThreads=2 – количество процессов для сборщика мусора.
- -XX:+UseG1GC – активирует новый сборщик мусора, разделяет всю память на определенные участки, и благодаря использованию нескольких ядер, собирает со всех участков неиспользуемую память.
- -XX:G1HeapRegionSize=32 – количество памяти, выделяемой под каждый участок.
- -XX:AutoGCSelectPauseMillis=2500 – количество времени в миллисекундах между вызовом автоматически выбраного сборщика мусора.
- -XX:MaxGCPauseMillis=1000 – длительность времени в миллисекундах между вызовом конкретного сборщика мусора. Для G1GC исполняет роль максимально установленного промежутка.
- -XX:SurvivorRatio=8 – количество радиуса для существования выживающих объектов (чем меньше число, тем больше место). Большее место дает возможность недавно сгенерированным объектам жить дольше перед очисткой мусора.
- -XX:TargetSurvivorRatio=90 – количество места в процентах под выживающие объекты, что позволит очищать больше неиспользуемых объектов во время сборки мусора.
Экспериментальные аргументы
- -XX:+AggressiveOpts – активация экспериментальных опций Java-машины.
(-XX:AutoBoxCacheMax=20000 -XX:BiasedLockingStartupDelay=500 -XX:+EliminateAutoBox -XX:+OptimizeFill -XX:+OptimizeStringConcat) - -XX:+UseBiasedLocking – ускорение синхронизации объектов на многоядерных процессорах.
- -XX:+UseFastAccessorMethods – использование оптимизированных версий вызова методов.
- -XX:+UseFastEmptyMethods – исключение из компиляции пустых методов.
- -XX:+UseCompressedOops – уменьшение размеров указателя, заголовков, а также сдвигов внутри созданных объектов. В зависимости от кода сэкономит 20-60% ОЗУ.
- -XX:+OptimizeFill – замена циклов работы с массивами на машинный код, что ускоряет работу
- -XX:+OptimizeStringConcat – оптимизация конкатенации объектов типа String. Вместо 20 вызовов одной операции на 20 символов, вызывает единожды на 400 символов
- -XX:+UseStringCache – включает кеширование объектов типа String. Где и как кешируется не понятно.
- -XX:-UseGCOverheadLimit – игнорирует нехватку памяти для сборки мусора, избавляет частично от Out Of Memory Error
- -XX:+CMSIncrementalPacing – автоматическое регулирование процессов CMS в Incremental mode.
- -XX:+CMSCleanOnEnter – очистка CMS при запуске Java-машины.
- -XX:+UseInterpreter – включение интерпретатора для некомпилированных методов.
- -XX:UseSSE=4 – использование инструкций SSE процессора. (0 – отключить, 1/2/3/4 – использование SSE/SSE2/SSE3/SSE4)
- -XX:MaxTenuringThreshold=15 – количество копирований выживающих объектов между разными местами.
- -XX:+RewriteFrequentPairs – перезапись недавно использовавшихся пар байткода в одно целое.
- -XX:+UseInlineCaches – использование внеочередного кеширования для виртуальных вызовов.
- -XX:+UseThreadPriorities – использование приоритета для процесса Java-машины.
- -XX:ThreadPriorityPolicy=42 – установка приоритета процесса для увеличения выделяемых ресурсов.