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

Надеюсь, мой туториал вам пригодился 🙂
 
Последнее редактирование:
ПС какой набор модов и плагинов на сервере? И набор модов на клиенте?
Еще нужно собирать. Это не быстро. Затянуться может на пол года. Я долго собираю.
вообще под случай свой подбирается
Это как?
вы по каким критериям составляли аргументы запуска?
Да тупо взял от сюда и все в 1 строку добавил. Да не по каким. Нужны критерии? А это как?
Еще хотел замоддить 1.7.10 версию больше 300 модов и самую новую на которую много модов есть, не меньше 200 модов. 1.7.10 уж очень хочется замодить. Всякие моды есть, проект ред и другие. Сервер м илиент буду одинаковые моды стоять. На сервере плагины свежие будут стоять не менее 10 шт. Конфиг для клиента будет схожим для сервера, игра буде как одиночная в клиенте так и на карте мира сервера.
Наверное буду использовать java 8, какие параметры убрать?
 
Последнее редактирование:
Еще нужно собирать. Это не быстро. Затянуться может на пол года. Я долго собираю.
это я написал что как то представлять какой набор модов вообще, тем более раз их кучка.
тестами SSP/SMP, время загрузки, как на фпс/фризы/утечки памяти/и т.д. влияет.
Да тупо взял от сюда и все в 1 строку добавил. Да не по каким. Нужны критерии? А это как?
разные параметры для разных вещей, и делают они разные вещи, какие то поднимают потребление памяти, но меньше фризов, какие то особо толку не дадут, какие то наоборот вредны.

Наверное буду использовать java 8, какие параметры убрать?
да кроме пермсайза никаких по сути, да и яву8 толк если если нужны моды ее требующие если не заморачиваться, или что понадобилось, ибо иначе толку от JVM 7 -> JVM 8, особо и нет, на фпс/тпс пофигу, утечек можно и больше словить, но это от того что и как, т.е. по случаю опять же. Я например не заметил что фпс поднялся клиента или стабильность сервера стала лучше, или запуск стал быстрее, а вот часть мини-фризов(они так же могут быть не на первом плане при осмотре объектов сгенерированного мира или проверки блоков из креатива) и утечек памяти меньше по сравнению с OracleJDK в редакции OpenJDK от Azul(в т.ч. если запустить сборку с "парой модов" на компе ближе к "офисному" ака более старому и менее мощному), более детально на яве8 от них же не смотрел особо, на яве7 больше копался, там же заметил что ParallelGC лучше счищал мусор чем его версия в ява8.
 
Последнее редактирование:
тестами SSP/SMP, время загрузки, как на фпс/фризы/утечки памяти/и т.д. влияет
Фризв есть и без модов с одним оптифайнHD.
более детально на яве8 от них же не смотрел особо, на яве7 больше копался, там же заметил что ParallelGC лучше счищал мусор чем его версия в ява8.
Понятно, но майник новый 1.12 кажется крашится на яве 7,даже не запускается. А на 8 работает, видать требует джаву 8 как и многие новые моды под 1.10.2 версии. Но более такие моды типа проект ред с плагинами и аддонами больше всего на 1.7.10 существуют, проблем не было с верссии 1.7.10. на яве 7.
 
Последнее редактирование:
Спасибо.
Оптимизировал свой сервер.
Раньше не хватало 2-х гигов,теперь меньше гига жрет
P.s приватный сервер,10 средний онлайн.
 
в каком направлении проводилась оптимизация?
 
в каком направлении проводилась оптимизация?
Не понял вопрос,вот что я сделал
java -Xincgc -Xmx2000M -Xmn158M -XX:+UseFastAccessorMethods -XX:+UseFastEmptyMethods -XX:+UseCompressedOops -XX:+OptimizeFill -XX:+OptimizeStringConcat -XX:-UseGCOverheadLimit -XX:+UseBiasedLocking -XX:+OptimizeStringConcat -Dfile.encoding=UTF-8 -jar spigot.jar
 
Ух ты..! Это очень интересно. Знать бы только, что значит каждый из параметров? )
 
while : ; do sleep 10 && java -Xincgc -Xmx10240M -Xms1024M -XX:+UseFastAccessorMethods -XX:+OptimizeStringConcat -XX:+UseBiasedLocking -XX:+AggressiveOpts -XX:MaxGCPauseMillis=10 -XX:UseSSE=4 -XX:+UseStringCache -jar server.jar nogui; done
День добрый. Собрал вот такой стартник для сервера. Есть что-нибудь лишнее или лучше какие-нибудь аргументы заменить на другие?
 
прости, а что означает:

while : ; do sleep 10 &&

?


Я понимаю, что это цикл. Но в чем смысл?
 
прости, а что означает:

while : ; do sleep 10 &&

?


Я понимаю, что это цикл. Но в чем смысл?
Если сервер крашится или он по каким-либо причинам сам остановился, то он его автоматически поднимает через 10 секунд
 
о, занятно

я это делаю через плагин AutoSaveWorld

кстати, на счет 10 секунд -- сложный момент; через 10 секунд после какого события будет запущен повторный старт?

дело в том, что есть событие "краш сервера" (сервер перестал отвечать) -- но при этом процессы еще висят, плагины еще в агонии, и игроки еще ничего не заметили -- и в этот момент еще нельзя запускать еще одну копию java, могут возникнуть проблемы с еще незакрытыми файлами (баз данных и др.)

это я теоретизирую
а вы на практике пробовали свой вариант стартника? нормально работает рестарт? сервер успевает умереть окончательно до рестарта?
 
Например сервер упал/перестал отвечать, проходит 10 секунд и сервер запускается по новой.

А в autosaveworld надо указывать полный путь до скрипта? (Например: /home/servername/start.sh?

Честно говоря, я новичок в этом деле, недавно начал только с этим разбираться. До этого тестировал этот стартник, но без дополнительных java-аргументов. Вроде как работало нормально.


А какой скрипт запуска используете вы?
 
да, путь нужно задавать от корня

а мой "запускач" выглядит так:

java -Xms1800M -Xmx2600M -XX:+UseFastAccessorMethods -XX:+UseFastEmptyMethods -XX:+UseCompressedOops -XX:+OptimizeFill -XX:+OptimizeStringConcat -XX:-UseGCOverheadLimit -XX:+UseBiasedLocking -XX:+OptimizeStringConcat -Dfile.encoding=UTF-8 -jar PaperSpigot.jar -o false

но все эти параметры я "подбирал" из этой беседы и толком не уверен в любом из них )
 
да, путь нужно задавать от корня

а мой "запускач" выглядит так:

java -Xms1800M -Xmx2600M -XX:+UseFastAccessorMethods -XX:+UseFastEmptyMethods -XX:+UseCompressedOops -XX:+OptimizeFill -XX:+OptimizeStringConcat -XX:-UseGCOverheadLimit -XX:+UseBiasedLocking -XX:+OptimizeStringConcat -Dfile.encoding=UTF-8 -jar PaperSpigot.jar -o false

но все эти параметры я "подбирал" из этой беседы и толком не уверен в любом из них )
какой максимальный онлайн был при использовании этого стартника?

За что отвечает -о false?
 
Вот вы с серверами работаете довольно долго, какой сборщик мусора посоветуете?
Что стоит убрать или заменить в данном стартнике? Сервер с модами.
Код:
while : ; do sleep 10 && java -Xincgc -Xmx10240M -Xms1024M -XX:+UseFastAccessorMethods -XX:+OptimizeStringConcat -XX:+UseBiasedLocking -XX:+AggressiveOpts -XX:MaxGCPauseMillis=100 -XX:UseSSE=4 -XX:+UseStringCache -Dfile.encoding=UTF-8 -jar server.jar nogui; done
 
да нет, просто интересно. Хотелось бы создать более стабильный стартник.
Хренасе, я думал моя тема уже давно померла.
Не трахай себе мозги, достаточно запускаться с дефолтными параметрами, разве-что указать -Xmn и MaxPermSize, хотя насчет последнего у меня есть сомнения. 😉
А в самом деле, вернулся после долгого отсутствия только лишь потому, что меня попросили сделать мини-сервачок для закрытого круга лиц. Так сказать, соибраюсь тряхнуть стариной)
BFDng5w.jpg
 
Назад
Верх Низ