Туториал Ускорение работы Java [Аргументы]

  • Автор темы Автор темы Starr
  • Дата начала Дата начала
ВНИМАНИЕ! Используйте только при крайней необходимости. Не стоит страдать этой уйнёй, автору просто нечем было заняться.

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

И так, приступим.
Я собрал множество аргументов с описанием, которые позволяют серверу, а также клиенту работать более оптимизировано и быстрее.

ВНИМАНИЕ! Для того, чтобы добиться максимальной производительности, лучше выбрать определенные аргументы, нежели вписывать все сразу.
На разных версиях Java и на разном железе - аргументы ведут себя по-разному. Так что лучше после установки аргумента каждый раз перепроверять, улучшилась производительность, или нет.


Пример строки запуска:
Код:
java -аргумент1 -аргумент2 -аргументN server.jar

Строка запуска моего сервера:
Код:
java -Xmx5G -Xmn192M -XX:+UseConcMarkSweepGC -jar server.jar

Аргументы моего клиента:
Код:
-Xmn256M

Выделение Java под конкретные ядра (только Linux)

Перед командой запуска сервера, добавьте эту команду:

Код:
taskset -c [ядра] [команда запуска]
[ядра] = 0,1,2,3 - указывать обязательно в таком формате.
Выражаем благодарность @scrik78



Список аргументов:

Основные флаги
  • -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 - установка приоритета процесса для увеличения выделяемых ресурсов.

Надеюсь, мой туториал вам пригодился 🙂
 
Последнее редактирование:
Как можно оптимизировать данную строку запуска?
Код:
"{JAVA}" -server -Xms{START_MEMORY}M -Xmx{MAX_MEMORY}M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled -XX:MaxGCPauseMillis=30 -XX:TargetSurvivorRatio=90 -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseBiasedLocking -Djline.terminal=jline.UnsupportedTerminal -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -Dfml.doNotBackup=true -noverify -Dfile.encoding=UTF-8 -jar "{JAR}" nogui
Java 8, Машинка: http://www.soyoustart.com/ie/offers/e3-ssd-3.xml
Стоят 4 сервера. Все запускаются одной и той-же строкой запуска.
 
Как можно оптимизировать данную строку запуска?
Код:
"{JAVA}" -server -Xms{START_MEMORY}M -Xmx{MAX_MEMORY}M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled -XX:MaxGCPauseMillis=30 -XX:TargetSurvivorRatio=90 -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseBiasedLocking -Djline.terminal=jline.UnsupportedTerminal -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -Dfml.doNotBackup=true -noverify -Dfile.encoding=UTF-8 -jar "{JAR}" nogui
Java 8, Машинка: http://www.soyoustart.com/ie/offers/e3-ssd-3.xml
Стоят 4 сервера. Все запускаются одной и той-же строкой запуска.
Убери это -XX:+DisableExplicitGC и это -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled.

Ну для начала лучше выделить -Xmn128M. Если 7 жаба, то выдели -XX:MaxPermSize=128M.
На вкус можешь выбрать заместо ConcMarkSweepGC - G1GC, но советую все-таки первый. Если пару ядер/потоков у процессора - выдели пару потоков под сборщик мусора -XX:ConcGCThreads=n.
Добавляй XX:+UseInterpreter, XX:+UseStringCache, XX:+UseFastEmptyMethods, XX:+RewriteFrequentPairs, XX:+UseInlineCaches, XX:SurvivorRatio=8. Если на серваке стоит апач, нгинх, или другое, то еще поставь приоритет -XX:+UseThreadPriorities, XX:ThreadPriorityPolicy=99.

В общем, что-то такое должно выйти.
Код:
"{JAVA}" -server -Xms{START_MEMORY}M -Xmx{MAX_MEMORY}M -Xmn128M -XX:MaxPermSize=128M -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=4 -XX:+CMSIncrementalMode -XX:MaxGCPauseMillis=30 -XX:TargetSurvivorRatio=90 -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseInterpreter -XX:+UseStringCache -XX:+UseFastEmptyMethods -XX:+RewriteFrequentPairs -XX:+UseInlineCaches -XX:SurvivorRatio=8 -XX:+UseBiasedLocking -XX:+UseThreadPriorities, XX:ThreadPriorityPolicy=99 -Djline.terminal=jline.UnsupportedTerminal -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -Dfml.doNotBackup=true -noverify -Dfile.encoding=UTF-8 -jar "{JAR}" nogui
 
Убери это -XX:+DisableExplicitGC и это -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled.

Ну для начала лучше выделить -Xmn128M. Если 7 жаба, то выдели -XX:MaxPermSize=128M.
На вкус можешь выбрать заместо ConcMarkSweepGC - G1GC, но советую все-таки первый. Если пару ядер/потоков у процессора - выдели пару потоков под сборщик мусора -XX:ConcGCThreads=n.
Добавляй XX:+UseInterpreter, XX:+UseStringCache, XX:+UseFastEmptyMethods, XX:+RewriteFrequentPairs, XX:+UseInlineCaches, XX:SurvivorRatio=8. Если на серваке стоит апач, нгинх, или другое, то еще поставь приоритет -XX:+UseThreadPriorities, XX:ThreadPriorityPolicy=99.

В общем, что-то такое должно выйти.
Код:
"{JAVA}" -server -Xms{START_MEMORY}M -Xmx{MAX_MEMORY}M -Xmn128M -XX:MaxPermSize=128M -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=4 -XX:+CMSIncrementalMode -XX:MaxGCPauseMillis=30 -XX:TargetSurvivorRatio=90 -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseInterpreter -XX:+UseStringCache -XX:+UseFastEmptyMethods -XX:+RewriteFrequentPairs -XX:+UseInlineCaches -XX:SurvivorRatio=8 -XX:+UseBiasedLocking -XX:+UseThreadPriorities, XX:ThreadPriorityPolicy=99 -Djline.terminal=jline.UnsupportedTerminal -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -Dfml.doNotBackup=true -noverify -Dfile.encoding=UTF-8 -jar "{JAR}" nogui
Спасибо, попробую.
Убери это -XX:+DisableExplicitGC и это -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled.

Ну для начала лучше выделить -Xmn128M. Если 7 жаба, то выдели -XX:MaxPermSize=128M.
На вкус можешь выбрать заместо ConcMarkSweepGC - G1GC, но советую все-таки первый. Если пару ядер/потоков у процессора - выдели пару потоков под сборщик мусора -XX:ConcGCThreads=n.
Добавляй XX:+UseInterpreter, XX:+UseStringCache, XX:+UseFastEmptyMethods, XX:+RewriteFrequentPairs, XX:+UseInlineCaches, XX:SurvivorRatio=8. Если на серваке стоит апач, нгинх, или другое, то еще поставь приоритет -XX:+UseThreadPriorities, XX:ThreadPriorityPolicy=99.

В общем, что-то такое должно выйти.
Код:
"{JAVA}" -server -Xms{START_MEMORY}M -Xmx{MAX_MEMORY}M -Xmn128M -XX:MaxPermSize=128M -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=4 -XX:+CMSIncrementalMode -XX:MaxGCPauseMillis=30 -XX:TargetSurvivorRatio=90 -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseInterpreter -XX:+UseStringCache -XX:+UseFastEmptyMethods -XX:+RewriteFrequentPairs -XX:+UseInlineCaches -XX:SurvivorRatio=8 -XX:+UseBiasedLocking -XX:+UseThreadPriorities, XX:ThreadPriorityPolicy=99 -Djline.terminal=jline.UnsupportedTerminal -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -Dfml.doNotBackup=true -noverify -Dfile.encoding=UTF-8 -jar "{JAR}" nogui
02.10 14:31:35 [Server] INFO Error: A fatal exception has occurred. Program will exit.
02.10 14:31:35 [Server] INFO Error: Could not create the Java Virtual Machine.
02.10 14:31:35 [Server] INFO Did you mean '(+/-)UseThreadPriorities'?
02.10 14:31:35 [Server] INFO Unrecognized VM option 'UseThreadPriorities,'
 
02.10 14:31:35 [Server] INFO Error: A fatal exception has occurred. Program will exit.
02.10 14:31:35 [Server] INFO Error: Could not create the Java Virtual Machine.
02.10 14:31:35 [Server] INFO Did you mean '(+/-)UseThreadPriorities'?
02.10 14:31:35 [Server] INFO Unrecognized VM option 'UseThreadPriorities,'

поставь перед "UseThreadPriorities" + или -...
 
Статья устарела лет на 10, как и инфа из поста автора (Почти все эти флаги true по дефолту в java8, а CMS GS то ещё гавно, особенно для последних версий minecraft)
Линк лишь для примера. Если особо горит, можно смотреть глубже. Сим постом как бэ указал, что обозначение и употребление данного флага не всегда может положительно сказаться на производительности.
Убери это -XX:+DisableExplicitGC и это -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled.

Ну для начала лучше выделить -Xmn128M. Если 7 жаба, то выдели -XX:MaxPermSize=128M.
На вкус можешь выбрать заместо ConcMarkSweepGC - G1GC, но советую все-таки первый. Если пару ядер/потоков у процессора - выдели пару потоков под сборщик мусора -XX:ConcGCThreads=n.
Добавляй XX:+UseInterpreter, XX:+UseStringCache, XX:+UseFastEmptyMethods, XX:+RewriteFrequentPairs, XX:+UseInlineCaches, XX:SurvivorRatio=8. Если на серваке стоит апач, нгинх, или другое, то еще поставь приоритет -XX:+UseThreadPriorities, XX:ThreadPriorityPolicy=99.

В общем, что-то такое должно выйти.
Код:
"{JAVA}" -server -Xms{START_MEMORY}M -Xmx{MAX_MEMORY}M -Xmn128M -XX:MaxPermSize=128M -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=4 -XX:+CMSIncrementalMode -XX:MaxGCPauseMillis=30 -XX:TargetSurvivorRatio=90 -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseInterpreter -XX:+UseStringCache -XX:+UseFastEmptyMethods -XX:+RewriteFrequentPairs -XX:+UseInlineCaches -XX:SurvivorRatio=8 -XX:+UseBiasedLocking -XX:+UseThreadPriorities, XX:ThreadPriorityPolicy=99 -Djline.terminal=jline.UnsupportedTerminal -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -Dfml.doNotBackup=true -noverify -Dfile.encoding=UTF-8 -jar "{JAR}" nogui
Ну не советуй мусор, хоспаде. Некоторые флаги, что ты указал, уже включены.
Вот вам трушный запускатор.
Код:
"{JAVA}" -server -Xms{MAX_MEMORY / 8}M -Xmx{MAX_MEMORY}M -Xmn128M -XX:MaxPermSize=128M -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -Dfml.doNotBackup=true -Dfile.encoding=UTF-8 -jar "{JAR}" nogui nojline
 
Линк лишь для примера. Если особо горит, можно смотреть глубже. Сим постом как бэ указал, что обозначение и употребление данного флага не всегда может положительно сказаться на производительности.
Ну не советуй мусор, хоспаде. Некоторые флаги, что ты указал, уже включены.
Вот вам трушный запускатор.
Код:
"{JAVA}" -server -Xms{MAX_MEMORY / 8}M -Xmx{MAX_MEMORY}M -Xmn128M -XX:MaxPermSize=128M -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -Dfml.doNotBackup=true -Dfile.encoding=UTF-8 -jar "{JAR}" nogui nojline
А ещё может отрицательно сказаться на стабильности.
А запусктор нифига не трушный, ибо тогда будет по дефолту ParallelGC у которого stop-the-world пауза при сборке мусора исчисляется секундами.
 
А запусктор нифига не трушный, ибо тогда будет по дефолту ParallelGC у которого stop-the-world пауза при сборке мусора исчисляется секундами.
У себя такой проблемы на ванили не наблюдаю. Ну, или по крайней мере не застал.
Алсо, вбрось более менее вменяемый gc, коли не трудно.
 
{MAX_MEMORY / 8}M что это? {MAX_MEMORY} задает значение для строки, а это значение редактируется через ПУ. Но опустим, зачем делить память?
 
{MAX_MEMORY / 8}M что это? {MAX_MEMORY} задает значение для строки, а это значение редактируется через ПУ. Но опустим, зачем делить память?
Чтобы получить минимально выделяемую память. Оно же в -Xms делится.
 
У себя такой проблемы на ванили не наблюдаю. Ну, или по крайней мере не застал.
Алсо, вбрось более менее вменяемый gc, коли не трудно.
Срачик о GC эта та ещё фигня.
Вообще на жабе 8 лучше G1GC, до - CMS. Правда их оба всё равно надо настраивать из-за перекоса использования памяти у майнкрафт сервера, очень много долгоживущих объектов.
 
юзаю самый простой запускатор,смысл юзать навороченные ? какой + ?
если можно то посоветуйте для ванили на 8 яву тру запускатор
 
юзаю самый простой запускатор,смысл юзать навороченные ? какой + ?
если можно то посоветуйте для ванили на 8 яву тру запускатор
Есть смысл в увеличении производительности.
Конечно, если руки из того места растут, и ты подберешь ту комбинацию аргументов, которая у тебя будет работать быстрее всех.
Немного обновил описания функций, добавил пару новых функций, также написал небольшой туторчик для gc.
Жду замечаний, если таковые имеются)
 
Ну и сама Java8 повышает производительность.
 
Сколько с ним ни игрался, существенного прироста не заметил - если он и был, то тонул в кол****иях фпс.
На клиенте разницы и не будет, не то количество оперативки чтобы вообще что-то сильно менялось.
 
Срачик о GC эта та ещё фигня.
Вообще на жабе 8 лучше G1GC, до - CMS. Правда их оба всё равно надо настраивать из-за перекоса использования памяти у майнкрафт сервера, очень много долгоживущих объектов.
Во оно как. Беда, дес.
Покурю за G1GC, а то интересно уж.
 
-Xincgc
Enables incremental garbage collection. This option was deprecated in JDK 8 with no replacement.
 
Назад
Верх Низ