Авторизация:
Логин:

Пароль:


Зарегистрироваться
или войти при помощи:
Все руководства

Руководство по аргументам запуска Java

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

Отказ от ответственности:
Это руководство является переводом алгоритма оптимизации Java "Paul's Reborn Neonate" и поможет оптимизировать работу майнкрафта как для ваниллы, так и для модпаков.
Все потенциальные ухудшения в производительности остаются на совести автора оригинального алгоритма. Я не несу ответственность за корректную работоспособность перечисленных ниже параметров запуска. Все флаги, описанные в данном руководстве, читатель использует на свой страх и риск.


Оригинальная статья: https://www.minecraftforum.net/forums/minecraf...-minecraft-jvm-arguments-guide

После выполнения рекомендаций из этого руководства, вы заметите следующее:
- Замедление операций по работе с памятью (из-за необходимости частого высвобождения)
- Ускорение обработки операций процессором и использование быстрых математических алгоритмов (Процессор будет использоваться более эффективно)
- Максимизировано использование Garbage Collector'а (сборка будет использовать минимальное количество памяти)
- Замедление загрузки модпака (из-за более эффективной работы с памятью)
- Более отзывчивый мир, более стабильный TPS (Из-за эффективной работы с ресурсами процессора)
- Большее количество параллельных вычислений (Больше параллельных потоков)

Начните тест со следующим набором аргументов (изменяйте их значения по необходимости):

-mx1G -XX:InitiatingHeapOccupancyPercent=10 -XX:AllocatePrefetchStyle=1 -XX:+UseSuperWord -XX:+OptimizeFill -XX:LoopUnrollMin=4 -XX:LoopMaxUnroll=16 -XX:+UseLoopPredicate -XX:+RangeCheckElimination -XX:+CMSCleanOnEnter -XX:+EliminateLocks -XX:+DoEscapeAnalysis -XX:+TieredCompilation -XX:+UseCodeCacheFlushing -XX:+UseFastJNIAccessors
-XX:+CMSScavengeBeforeRemark -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+ScavengeBeforeFullGC -XX:+AlwaysPreTouch -XX:+UseFastAccessorMethods -XX:+UnlockExperimentalVMOptions -XX:G1HeapWastePercent=10 -XX:G1MaxNewSizePercent=10 -XX:G1HeapRegionSize=32M -XX:G1NewSizePercent=10 -XX:MaxGCPauseMillis=100 -XX:+OptimizeStringConcat -XX:+UseParNewGC -XX:+UseNUMA -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=2 -XX:+DisableExplicitGC




Аргументы, которые нужно изменять в первую очередь:

-mx1G
Динамическое выделение памяти. Этот флаг заставляет java выделять память динамически по мере необходимости, а не весь объем сразу.
Установите в значение максимально допустимого объема памяти.

-Xss2048k
Параметр изменяет размер стэка для потоков процессора (128, 512, 1024, 2048, 4096)
Установлено оптимальное значение, однако, можно поиграться с параметром, чтобы добиться большей стабильности (Может вызывать зависания!)

-XX:+UseLargePages
Установите этот флаг, если выделяете для сборки большое количество памяти.

-XX:ParallelGCThreads=8
Количество потоков Garbage Collector'а (1 физическое ядро = 1 поток, если у вас включен Hyperthreading, то 1 физическое ядро = 2 потока)
Установите согласно количеству ядер вашего процессора.

-XX:SurvivorRatio=1
Определяет "EDEN Space", каждая единица равна 0,5GB памяти для объектов, которые создаются при загрузке.
Определите, какую часть памяти вы готовы выделить на стартовые объекты.

-XX:MaxGCPauseMillis=250
Минимальная пауза между запуском Garbage Collector'а в миллисекундах.
Попробуйте выставлять разные значения, чтобы избежать небольшого периодического лага.

-XX:MaxMetaspaceSize=320m
Выделяет постоянную память. Алгоритм подразумевает использование 300 мебагайт на каждые 200 модов (в среднем).
Внимание! Этот флаг может вызывать ошибки "Out of memory"!



Аргументы, которые крайне рекомендуется включить в список запуска:

-mx1G
Динамическое выделение памяти. Этот флаг заставляет java выделять память динамически по мере необходимости, а не весь объем сразу.
Установите в значение максимально допустимого объема памяти.

-XX:+UseConcMarkSweepGC
Удаляет старые объекты из буфера Garbage Collector'а. Оптимизирует использование памяти.

-XX:+CMSClassUnloadingEnabled
Высвобождает выделенную, но давно не используемую память.

-XX:+DisableExplicitGC
Заставляет Garbage Collector игнорировать принудительные вызовы, которые могут отрицательно сказаться на производительности.

-XX:+UseCompressedOops
Позволяет использовать 32-битные ссылки в 64-битном окружении.
Сохраняет приличное количество памяти в некоторых случаях.

-XX:+UseNUMA
Включает использование архитектуры NUMA.
Оптимизирует алгоритмы работы с памятью и потоками процессора.

-XX:+UseParNewGC
Включает распараллеливание вызовов Garbage Collector'а.
Снижает задержки при вызовах GC, и заставляет игру выполняться более плавно.

-XX:G1NewSizePercent=10
Устанавливает процент памяти, которая будет выделяться на новые объекты при их создании.
Снижает используемый объем памяти.

-XX:G1ReservePercent=10
Резервирует процент памяти, используемый на G1.
Не только снижает используемый объем памяти, но и предотвращает ее глобальный рост.

-XX:G1HeapRegionSize=32M
Устанавливает размер области памяти для G1.
Помимо процентного указания, целесообразно указать и реальное значение памяти.

-XX:G1MaxNewSizePercent=10
Устанавливает максимальный процент памяти, которая будет выделяться на новые объекты при их создании.
Заставим наш GC запускаться чаще, но не слишком часто.

-XX:G1HeapWastePercent=10
Устанавливает процент "мусора" в GC, который считается допустимым.
Не будем засорять память всякой ненужной фигней.

-XX:+UnlockExperimentalVMOptions
Разрешает использование всех перечисляемых здесь аргументов.
Обязательно установите этот флаг, если играетесь с аргументами.

-XX:+OptimizeStringConcat
Произвольные недокументированные алгоритмы оптимизации работы со строками.
Видимо, что-то улучшает, но, главное, не делает хуже.

-XX:+UseFastAccessorMethods
Использовать оптимизированные методы доступа.
Исключает различные проверки при обращении к объектам. Увеличивает скорость работы, но может вызывать нестабильность, если автор мода - лентяй.

-XX:+AlwaysPreTouch
Очищает выделяемую область памяти перед использованием.
Замедляет загрузку, однако увеличивает общую производительность при работе с большими объемами памяти.

-XX:+ScavengeBeforeFullGC
Сначала очищает новые объекты в GC, а затем уже проводит полный цикл.
Снижает затраты памяти на GC.

-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
Отключает часовые перерывы в работе GC из RMI, и выгружает классы.
Разгружает память и снижает количество задержек при работе GC.

-XX:+CMSScavengeBeforeRemark
Пытается очистить мелкие объекты перед запуском полного цикла GC.
Снижает лаг, оптимизирует работу с памятью.

-XX:+AlwaysTenure
Использует старый алгоритм GC для оставшихся объектов.
Флаг нужно использовать при включении новых алгоритмов GC, однако, он нам ломает всю оптимизацию.

-XX:+UseFastJNIAccessors
Использовать быстрые алгоритмы доступа к сторонним библиотекам, написанным на других языках.

-XX:+UseCodeCacheFlushing
Сброс страниц кеша для снижения объема используемой памяти.

-XX:+TieredCompilation
Выключает компиляцию 1, 2 и 3 уровней для увеличения скорости компиляции.
Сильно оптимизирует работу процессора и памяти.

-XX:+AggressiveOpts
Использование этого флага совместно с "AutoBoxCacheMax" (который оптимизирует работу процессора) позволит поднять производительность за счет увеличения объема используемой памяти.
Включите этот флаг, если готовы пожертвовать дополнительными 10-50MB памяти.

-XX:+UseBiasedLocking
Используется на многоядерных процессорах для увеличения производительности параллельных вычислений.
Включите флаг, если у вас больше двух физических ядер.

-XX:+DoEscapeAnalysis
Оптимизирует задержки при параллельных вычислениях.
Включите флаг, если у вас больше двух физических ядер.

-XX:+EliminateLocks
Оптимизирует задержки при параллельных вычислениях.
Включите флаг, если у вас больше двух физических ядер.

-XX:+CompileThreshold
Использовать быстрый алгоритм профайлинга.
Может помочь со скоростью загрузки, однако не всегда работает.

-XX:+CMSCleanOnEnter
Улучшает производительность снижая допустимое количество "грязных карт".
Сам не понимаю, как это работает.

-XX:AllocatePrefetchStyle=1
Включает предзагружку бОльшего количества скомпилированного кода.
Флаг используется по-умолчанию в Java версий 9+

-XX:+UseSuperWord -XX:+OptimizeFill -XX:LoopUnrollMin=4 -XX:LoopMaxUnroll=16 -XX:+UseLoopPredicate -XX:+RangeCheckElimination
Увеличивает производительность циклов и использует оптимизированные вычислительные методы, для ускорения обработки.
Спасибо Ивану Мамонтову

-XX:InitiatingHeapOccupancyPercent=10
Определяет процент памяти, когда следует запустить Garbage Collector
Let's force the GC to collect at 10% of it's limit
Более часто - меньше производительность, менее часто - меньше использованной памяти.



Аргументы, которые не следует использовать:

-XX:+ReduceSignalUsage
Снижает количество сигнализации между VM и процессором.
Снижение производительности на 1-4%

-XX:+UseMembar
Включает алгоритм "true memory" для совместимости со старым кодом.
Снижение производительности на 10%



© ZigTheHedge & Elfa. 2019.