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

Надеюсь, мой туториал вам пригодился 🙂
 
Последнее редактирование:
Полезно очень даже...Эти аргументы подойдут для клиента?
 
Полезно очень даже...Эти аргументы подойдут для клиента?
Да, большинство из аргументов подходят и для клиента.
Советую только GC не использовать на клиенте, для него нужна тонкая настройка,
в противном случаи возможны некоторые фризы.
 
Да, большинство из аргументов подходят и для клиента.
Советую только GC не использовать на клиенте, для него нужна тонкая настройка,
в противном случаи возможны некоторые фризы.
GC это Габич коллектор?
 
Да, большинство из аргументов подходят и для клиента.
Советую только GC не использовать на клиенте, для него нужна тонкая настройка,
в противном случаи возможны некоторые фризы.
Советую добавить в тему строку и для клиента, а иначе вопросы по этому поводу не прекратятся
 
GC это Габич коллектор?
Именно он.
Гарбаж колектор не актуален для очень слабых машинок так как он фризит яву при сборке мусора чересчур сильно. А чтоб оптимизировать его под клиент нужно не один вариант комбинаций написать)
Советую добавить в тему строку и для клиента, а иначе вопросы по этому поводу не прекратятся
Ок, добавлю.

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

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

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

Строка запуска моего сервера:
Код:
java -server -Xincgc -Xmx5G -Xms512M -Xmn128M -XX:SharedReadOnlySize=128M -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=4 -XX:AutoGCSelectPauseMillis=2500 -XX:+AggressiveOpts -XX:+UnlockExperimentalVMOptions -XX:+UseBiasedLocking -XX:+UseFastAccessorMethods -XX:+UseStringCache -XX:-UseGCOverheadLimit -XX:UseSSE=4 -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=15 -XX:+RewriteFrequentPairs -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 server.jar

Аргументы моего клиента:
Код:
-Xmn392M -XX:SharedReadOnlySize=128M -XX:+UnlockCommercialFeatures -XX:+AggressiveOpts -XX:+UnlockExperimentalVMOptions -XX:+UseBiasedLocking -XX:+UseFastAccessorMethods -XX:+UseStringCache -XX:UseSSE=4 -XX:SurvivorRatio=4 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=15 -XX:+RewriteFrequentPairs -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=99 -XX:+OptimizeStringConcat -XX:+CMSCleanOnEnter -XX:+CMSIncrementalPacing -XX:+UseInlineCaches


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

Основные флаги


Выделение памяти


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


Экспериментальные аргументы


Надеюсь, мой туториал вам пригодился 🙂
Взял из аргументов FMX 😁
Но спасибо, что объясил кажое из них.
 
Взял из аргументов FMX 😁
Но спасибо, что объясил кажое из них.
Часть из него, часть из собственного опыта и гугла.
З.Ы. В аргументах fmx дофигища ненужного и неработающего мусора)
Лучше б сказал, какой это дает прирост в производительности и у всех пропадет желание этим заниматься 😁
Зависит от машинки, на разных железках эффект разнится.
В майне самом разницы, честно говоря, не заметил. Мб на самых слабых железяках разница хоть какая-то будет.

В случаи использования на серваках, при правильной настройке, есть определенной прирост производительности, хоть и не совсем значительный в некоторых аспектах 😉
 
Где-то видел аргументы, способные запускать сервер на определенном(ых) ядрах.
@Starr Можете такие добавить?
Нужно для Linux
 
Последнее редактирование:
Где-то видел аргументы, способные запускать сервер на определенном(ых) ядрах.
@Starr Можете такие добавить?
Насколько знаю, это невозможно.
Возможно лишь выделять под сборщика мусора несколько ядер.
 
Всё-таки рекомендую почитать про -XX:+AggressiveOpts и другие флаги.
Статья устарела лет на 10, как и инфа из поста автора (Почти все эти флаги true по дефолту в java8, а CMS GS то ещё гавно, особенно для последних версий minecraft)
 
Хахаххаха. пришел обосрал, ушел))) Норм)
 
Хахаххаха. пришел обосрал, ушел))) Норм)
А всё потому что инфа из таких постов устаревает почти с каждым новым апдейтом жабы. Во всей статье есть только 1 флаг который реально полезен, и 1 спорный. Остальные либо уже имеют указанное значения, либо значение выбирается наилучшее в зависимости от платформы на котором запущена жаба. Ещё 2 параметра не играют никакой роли на производительность майнкрафт сервера либо клиента.
Исключения составляет вечный срач о том какой сборщик мусора лучше, но тут уже ситуация меняется с каждым апдейтом майнкрафта, да и полностью знать как работает тот или иной сборщик мусора тот ещё гемор, а сижу с вечно включённым профайлером тут только я.
 
Назад
Верх Низ