Это руководство по настройке Java для Minecraft. Каждый флаг и настройка индивидуально тестируются на наличие регрессий и сверяются со значениями Java по умолчанию, чтобы избежать избыточности.
Хотя эти настройки заметно уменьшают некоторые подвисания сервера и клиента, ожидайте лишь скромного прироста TPS + в лучшем случае минимального прироста FPS и некоторого увеличения использования ОЗУ + ЦП. И они не заменят устранение тормозящих проблем с помощью таких модов, как Spark или Observable.
Discord для вопросов и прочего: https://discord.gg/zeFSR9PnUw
Все флаги проверяются с помощью скрипта Benchmark.py. См. незавершенную работу Benchmarks.md.
Для Minecraft 1.16.5 и более поздних версий используйте Java 17. Некоторые программы запуска, такие как Curseforge и Prism Launcher, просят вас использовать Java 8 в версии 1.16.X, но Minecraft 1.16.5+, все моды 1.18+ и большинство модов 1.16.5 совместимы. с Явой 17.
Иногда Java 11 будет работать там, где Java 17 — нет.
Для версий 1.12.2 и ниже обычно требуется Java 8.
Среды выполнения Java от Azul, Microsoft, Adoptium, Amazon и т. д. в основном идентичны. Некоторые заметные исключения:
Oracle GraalVM Enterprise Edition имеет более агрессивный компилятор Java. Это то, с чем я лично запускаю Minecraft, см. раздел GraalVM ниже.
Intel Clear Linux OpenJDK использует тот же код, что и любой другой OpenJDK (что делает его очень совместимым), но сам процесс сборки и зависимости оптимизированы для новых процессоров. Загрузите его из репозитория Clear Linux через swupd
, из Distrobox или из Docker. Обратите внимание, что вам необходимо вернуться к выпуску Java 17, а в Java 18 некоторые улучшения производительности отменены.
Prime OpenJDK от Azul работает очень быстро, поскольку он подключается к llvm, но в настоящее время он несовместим с большинством модов и предназначен только для Linux. Получите его здесь: https://docs.azul.com/prime/prime-quick-start-tar.
В Red Hat Java 8 имеется сборщик мусора Shenandoah. Он защищен бесплатной регистрацией по электронной почте: https://developers.redhat.com/products/openjdk/download.
OpenJ9 от IBM ... намного медленнее в Minecraft и использует совершенно другие флаги, чем любая другая сборка Java, но он потребляет меньше памяти, чем среды выполнения на основе OpenJDK. См. FAQ, папку Benchmarks и этот Gist, чтобы узнать о флагах низкого потребления памяти.
Если вы не знаете, что выбрать, я рекомендую GraalVM EE (см. ниже) или последнюю версию Adoptium Java 17 JRE: https://adoptium.net/
Couleur ведет хороший список JRE здесь: https://rentry.co/JREs.
Эти оптимизированные флаги работают с любой сборкой Java 11+. Они работают как на серверах, так и на клиентах:
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3
Вы должны добавить флаги сборки мусора к этим аргументам Java.
-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m
Минимальная и максимальная ( -xms
и -xmx
) память должны быть установлены на одно и то же значение, как описано здесь: https://dzone.com/articles/benefits-of-setting-initial-and-maximum-memory-siz.
Единственное исключение: если у вас система с низким объемом памяти, а Minecraft занимает почти всю вашу оперативную память, установите минимальный объем памяти ниже максимального, чтобы сэкономить как можно больше.
Размеры задаются в мегабайтах ( -Xms4096M
) или гигабайтах ( -Xmx8G
).
Выделение слишком большого количества памяти может привести к поломке gc или просто замедлить работу Minecraft, даже если у вас ее достаточно. Слишком малое выделение также может замедлить или сломать игру. Внимательно следите за диспетчером задач Windows (или системным монитором вашего DE) во время работы Minecraft и выделяйте столько, сколько ему необходимо (обычно меньше 8 ГБ). sparkc gcmonitor
сообщит вам, если ваше распределение слишком велико (паузы будут слишком длинными) или слишком низкими (частый сбор мусора с предупреждением о нехватке памяти в уведомлении).
Флаги сбора мусора должны быть добавлены на серверы и клиенты Minecraft , поскольку по умолчанию «пауза» для остановки и сбора мусора проявляется в виде заиканий на клиенте и задержек на серверах. Используйте команду /sparkc gcmonitor
в моде Spark, чтобы наблюдать за паузами в игре. Любые паузы старых поколений плохи, а коллекции G1GC молодого поколения должны быть нечастыми, но достаточно короткими, чтобы быть незаметными.
Выберите один набор флагов. Я рекомендую Shenandoah на клиентах , ZGC на мощных серверах Java 17 и G1GC на Graal или на серверах/клиентах с меньшим объемом оперативной памяти и меньшим количеством ядер:
ZGC отлично подходит для серверов с большим объемом памяти и большим количеством ядер. У него нет никакого снижения пропускной способности сервера, которое я мог бы измерить, и он абсолютно не заикается. Однако для него требуется больше оперативной памяти и ядер, чем для других сборщиков мусора.
К сожалению, на моем ноутбуке (8-ядерный/16-поточный) он значительно снижает клиентский FPS. См. тест «ZGC» в папке тестов. Он недоступен в Java 8 и гораздо менее эффективен в Java 11, чем в Java 17.
-XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:-ZProactive
включает его, но выделяет больше оперативной памяти и больше ConcGCThreads
, чем обычно для других сборщиков мусора. Обратите внимание, что ZGC не нравится AllocatePrefetchStyle=3, поэтому установка значения 1 переопределяет предыдущую запись. ты
Shenandoah хорошо работает на клиентах, но в моих тестах снижает пропускную способность сервера. Включите его с помощью -XX:+UseShenandoahGC -XX:ShenandoahGCMode=iu -XX:ShenandoahGuaranteedGCInterval=1000000 -XX:AllocatePrefetchStyle=1
Дополнительные варианты тюнинга смотрите здесь. Параметры «herustic» и «mode» для меня особо не меняются (за исключением «compact», который вам не следует использовать). Как и ZGC, Шенандоа не нравится AllocatePrefetchStyle=3.
Обратите внимание, что Shenandoah нет в Java 8. Его также нет ни в одной сборке Oracle Java! Если вы являетесь пользователем Java 8, вам необходимо использовать Red Hat OpenJDK для использования Shenandoah: https://developers.redhat.com/products/openjdk/download
G1GC — это сборщик мусора по умолчанию и единственный доступный сборщик мусора для пользователей GraalVM. Аргументы знаменитого сервера Minecraft Майкара G1GC отлично работают на клиентах, но с двумя оговорками: они эффективно ограничивают параметр MaxGCPauseMillis
, устанавливая G1NewSizePercent
так высоко, что приводит к длительным заиканиям на некоторых клиентах, и они слишком агрессивно собирают старый мусор (поскольку клиент производит гораздо меньше, чем заполненный сервер).
Они похожи на флаги aikar, но с более короткими и частыми паузами, менее агрессивной смешанной сборкой G1 и более агрессивной фоновой сборкой: -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99
G1NewSizePercent
и MaxGCPauseMillis
можно использовать для настройки частоты/длительности ваших коллекций молодого поколения. G1HeapWastePercent=18
следует удалить, если в вашей настройке возникают какие-либо паузы старого поколения. Альтернативно вы можете поднять его и установить для G1MixedGCCountTarget
значение 2 или 1, чтобы сделать смешанную сборку мусора еще более ленивой (за счет большего использования памяти).
Более длинные паузы более приемлемы на серверах. Эти флаги очень близки к настройкам aikar по умолчанию:
-XX:+UseG1GC -XX:MaxGCPauseMillis=130 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=28 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=20 -XX:G1MixedGCCountTarget=3 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150
-XX:ConcGCThreads=[Some Number]
контролирует максимальное количество фоновых потоков, которые может использовать сборщик мусора, и по умолчанию использует logical (hyperthreaded) cores / 4
. В последних версиях Java количество потоков gc будет уменьшено, если это необходимо.
В некоторых случаях (особенно с ZGC или Shenandoh) вам нужно увеличить ограничение потока сверх значения по умолчанию. Я рекомендую «2» для процессоров с 4 потоками и [number of real cores - 2]
для большинства других процессоров, но вам, возможно, придется поиграть с этим параметром. Если оно слишком низкое, сбор мусора не сможет справиться с Minecraft, и игра будет заикаться и/или начнет потреблять кучу оперативной памяти и вылетать. Если оно слишком высокое, это может замедлить игру, особенно если вы используете Java 8.
Никаких других флагов «поточности», таких как ParallelGCThreads
или JVMCIThreads
не требуется, поскольку они включены по умолчанию с хорошими автоматическими настройками в Java 8+.
ПРИМЕЧАНИЕ. Для работы с большими страницами требуются права администратора в Windows. Это угроза безопасности, и вам следует пропустить этот раздел, если вас это не устраивает.
Включение больших страниц повышает производительность серверов и клиентов Minecraft. Вот несколько отличных руководств по его включению:
В Windows вы должны запускать Java и программу запуска от имени администратора. Это означает, что необходимо установить флажок совместимости «Запуск от имени администратора» для javaw.exe
, java.exe
и your launcher.exe
, в противном случае большие страницы автоматически завершатся сбоем. Добавьте -XX:+UseLargePages -XX:LargePageSizeInBytes=2m
к вашим аргументам.
В Linux обычно лучше использовать -XX:+UseTransparentHugePages
. Чтобы вместо этого выделить память вручную (для большего повышения производительности), у Red Hat есть хорошее руководство для RHEL-подобных дистрибутивов Linux, таких как Fedora, CentOS или Oracle Linux: https://www.redhat.com/en/blog/optimizing -rhel-8-run-java-реализация-minecraft-сервер
Проверьте, работают ли большие страницы с аргументом Java -Xlog:gc+init
в Java 17.
В любой версии/платформе Java, если большие страницы не работают, в журнале вы получите предупреждение, подобное этому:
Предупреждение виртуальной машины 64-разрядного сервера Java HotSpot(TM): JVM не может использовать большую страничную память, поскольку у нее недостаточно привилегий для блокировки страниц в памяти.
GraalVM — это новая виртуальная машина Java от Oracle, которая может улучшить производительность Minecraft (модифицированного и ванильного). Хотя прирост клиентского FPS скромен, рабочие нагрузки на стороне сервера, такие как генерация фрагментов, могут получить прирост более чем на 20 %!
Только GraalVM Enterprise Edition поставляется с полным набором оптимизаций. Загрузите его по прямым ссылкам от Oracle:
Windows AMD64 (64-разрядная версия): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-windows-amd64-22.3.1.zip
Linux AMD64 (64-разрядная версия): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-linux-amd64-22.3.1.tar.gz
Linux AARCH64 (64-разрядная версия ARM): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-linux-aarch64-22.3.1.tar.gz
Mac AMD64 (64-разрядная версия): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA17_22_3_1/graalvm-ee-java17-darwin-amd64-22.3.1.tar.gz
Windows AMD64 (64-разрядная версия): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-windows-amd64-22.3.1.zip
Linux AMD64 (64-разрядная версия): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-linux-amd64-22.3.1.tar.gz
Linux AARCH64 (64-разрядная версия ARM): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-linux-aarch64-22.3.1.tar.gz
Mac AMD64 (64-разрядная версия): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA11_22_3_1/graalvm-ee-java11-darwin-amd64-22.3.1.tar.gz
Windows AMD64 (64-разрядная версия): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-windows-amd64-21.3.5.zip
Linux AMD64 (64-разрядная версия): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-linux-amd64-21.3.5.tar.gz
Mac AMD64 (64-разрядная версия): https://oca.opensource.oracle.com/gds/GRAALVM_EE_JAVA8_21_3_5/graalvm-ee-java8-darwin-amd64-21.3.5.tar.gz
(Некоторые версии GraalVM EE также доступны в AUR и репозиториях Oracle Linux)
Новые версии для компьютеров Mac с ARM требуют бесплатной регистрации на главной странице загрузки Oracle: https://www.oracle.com/downloads/graalvm-downloads.html.
Эти выпуски не являются установщиками Java. Вам необходимо вручную заменить версию Java в средстве запуска или использовать средство запуска Minecraft, которое поддерживает указание пути к Java. Я рекомендую ATLauncher, Prism Launcher или GDLauncher. При указании пути к Java перейдите в папку «bin» в загрузке GraalVM и используйте «javaw.exe» или «java.exe».
Для серверов вам необходимо заменить команду «java» в стартовом файле sh/bat вашего сервера на полный путь к graalvm java в кавычках.
Кроме того, вы можете установить его для всей системы, следуя руководству Oracle: https://www.graalvm.org/22.2/docs/getting-started/#install-graalvm.
Аргументы в пользу GraalVM EE 22+ Java 17 (или Java 11):
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:AllocatePrefetchStyle=3 -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise
Вы должны использовать G1GC с этими аргументами. GraalVM в настоящее время не работает с ZGC или Shenandoah.
GraalVM EE 22.3.0 исправляет все известные ошибки Minecraft
Если вы используете более старую версию GraalVM на базе Java 8, могут возникнуть некоторые потенциальные проблемы:
VectorizeSIMD
делает объекты невидимыми с помощью шейдерных модов, таких как Optifine, Iris или Occulus... но только при определенных условиях. Это будет исправлено в GraalVM EE 22.3.0. См.: оракул/грааль#4849.
GraalVM CE и EE нарушают рендеринг созвездий в 1.16.5 Astral Sorcery. Возможно, это связано с ошибкой шейдера. См.: HellFirePvP/AstralSorcery#1963.
Никаких ошибок на стороне сервера я пока не заметил.
Если вы столкнулись с какими-либо другими проблемами с модами, которые можно отнести к GraalVM, создайте проблему на Github или опубликуйте ее в Discord! Как правило, их можно обойти, отключив основные флаги оптимизации dgraal
или найдя нужную функцию с помощью Dgraal.PrintCompilation=true
и обойдя ее с помощью -Dgraal.GraalCompileOnly=~...
как только вы обнаружите неправильно скомпилированную функцию.
«Универсальный» мод для Windows, похожий на ReShade, SpecialK имеет два основных преимущества в производительности:
«Умный» ограничитель кадров, который уменьшает заикание, устраняет разрывы, экономит электроэнергию и сохраняет TDP процессора для повышения при необходимости. Он даже работает в сочетании с VRR или Nvidia Reflex.
Оболочка OpenGL-to-DirectX11 под названием OpenGL-IK, которая устраняет издержки оконного режима Minecraft и обеспечивает другие функции (например, автоматический HDR или окно без полей с изменяемым размером).
Загрузите его здесь: https://wiki.special-k.info/en/SpecialK/Tools.
Добавьте программу запуска MC и установите флажок «Повышенный сервис». Затем перейдите в папку java bin, где находится ваш javaw.exe, и создайте пустой файл с именем SpecialK.OpenGL32
. Запустите программу запуска Minecraft с помощью программы запуска SpecialK, и программа запуска затем «внедрит» SpecialK в Minecraft.
Для еще большего удобства вы можете создать ярлык для программы запуска Minecraft на рабочем столе через пользовательский интерфейс SpecialK.
Обязательно отключите VSync и внутриигровой ограничитель кадров Minecraft.
Один пользователь сообщил о снижении FPS при запуске SpecialK. Если это произойдет с вами, сообщите мне об этом через Discord или Github!
После запуска Minecraft установите Java для запуска процесса «Выше нормального» в Windows с помощью диспетчера задач:
Пользователи Linux могут добавить sudo nice -n -10
в начало команды запуска, но учтите, что уровни nice ниже 0 (с «максимальным» значением -20) требуют запуска Minecraft как sudo
. Альтернативно, используйте команду renice
после запуска Minecraft, чтобы избежать этой угрозы безопасности.
Это фантастический репозиторий для поиска модов производительности: https://github.com/NordicGamerFE/usefulmods.
Вместо Optifine я бы порекомендовал более совместимые альтернативы, такие как Sodium + Iris или Rubidium + Oculus.
Я рекомендую использовать Java 17 или, в противном случае, Java 11, если только версия 8 не является абсолютно необходимой. Но если это так, то эти флаги будут работать с OpenJDK8 вместе с Shenandoh GC (для Red Hat OpenJDK на клиентах) или G1GC (для всего остального):
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxInlineLevel=15 -XX:MaxVectorSize=32 -XX:+UseCompressedOops -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -Dgraal.CompilerConfiguration=community
Пользователи x86 Java 8 (то есть большинство пользователей Java 8) могут добавить следующие дополнительные аргументы:
-XX:+UseXMMForArrayCopy
Вы также можете получить версии GraalVM EE для Java 8 из раздела 21.X на сайте Oracle и использовать следующие аргументы:
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:AllocatePrefetchStyle=1 -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -XX:+EnableJVMCI -XX:+UseJVMCICompiler -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise -Dgraal.UsePriorityInlining=true -Dgraal.Vectorization=true -Dgraal.OptDuplication=true -Dgraal.DetectInvertedLoopsAsCounted=true -Dgraal.LoopInversion=true -Dgraal.VectorizeHashes=true -Dgraal.EnterprisePartialUnroll=true -Dgraal.VectorizeSIMD=true -Dgraal.StripMineNonCountedLoops=true -Dgraal.SpeculativeGuardMovement=true -Dgraal.InfeasiblePathCorrelation=true
Обязательно установите для -Dgraal.VectorizeSIMD
значение false
если вы запускаете шейдеры.
Запустите свои серверы Minecraft на Clear Linux! На сегодняшний день это наиболее оптимизированный готовый дистрибутив Linux, и он имеет некоторые другие приятные функции (например, систему конфигурации без сохранения состояния). Он также довольно хорошо запускает клиенты на графических процессорах AMD/Intel: https://web.archive.org/web/20220916090057/https://docs.01.org/clearlinux/latest/tutorials/multi-boot/dual-boot- win.html
Oracle Linux также является хорошим выбором для серверов, поскольку он достаточно хорошо оптимизирован «из коробки» и имеет Graalvm EE, доступный через менеджер пакетов. Для клиентов отлично подходят дистрибутивы на базе Arch, такие как CachyOS или EndeavorOS, поскольку они имеют широкую поддержку большинства аппаратных средств.
Убедитесь, что клиент Minecraft использует ваш дискретный графический процессор! Проверьте вкладку F3 и заставьте Minecraft использовать ее в « Настройках графики Windows », а не в панели управления AMD/Nvidia (поскольку они, похоже, больше не работают).
Пользователи Linux-клиента Minecraft должны проверить https://github.com/Admicos/minecraft-wayland.
Закройте все, что работает в фоновом режиме, включая Discord, средства запуска игр и браузер! Minecraft ресурсоемок и не любит, когда другие приложения генерируют прерывания процессора или потребляют дисковый ввод-вывод, оперативную память и так далее.
В Java 18/19 есть некоторые несовместимости модов. Сообщается, что они работают с некоторыми пакетами модов, но я не уверен, есть ли какой-либо выигрыш в производительности.
Настройки Java улучшают производительность сервера и снижают заикание клиента, но они не сильно повышают средний FPS клиента (если вообще повышают). Для этого гораздо важнее использовать правильные/обновленные графические драйверы и моды производительности: https://github.com/NordicGamerFE/usefulmods
В этом руководстве предполагается, что при запуске Minecraft у вас есть немного свободной оперативной памяти. Если ваша установка ограничена оперативной памятью, попробуйте удалить следующие аргументы, в частности: -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M
и попробуйте сервер G1GC аргументы.
IBM OpenJ9 действительно экономит оперативную память, как следует из его репутации, но в моих тестах он более чем на 30% медленнее при серверном чанкгене. Если есть какие-либо флаги, которые делают его конкурентоспособным по сравнению с OpenJDK, сообщите мне об этом в Discord или здесь: #9
-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions
просто разблокирует больше флагов для использования. Их можно перечислить с помощью флагов -XX:+PrintFlagsFinal
и -XX:+JVMCIPrintProperties
, см. дампы флагов.-XX:G1MixedGCCountTarget=3
: это количество блоков gc старого поколения, на которое будет нацелен «смешанный» gc. Эти смешанные коллекции работают намного медленнее, а клиент Minecraft не генерирует OldGen очень быстро, поэтому мы можем снизить это значение до 3, 2 или даже 1 для более коротких пауз GC.-XX:+UseNUMA
включает оптимизацию для многосокетных систем, если это применимо. Не уверен, относится ли это к процессорам MCM, таким как Ryzen или Epyc, но если это неприменимо, оно автоматически отключается.-XX:-DontCompileHugeMethods
Позволяет компилировать огромные методы. Некоторые из них есть в модифицированном Minecraft, и нас не волнует более высокая загрузка процессора фоновым компилятором.-XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000
Включить оптимизацию более крупных методов. См.: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8058148.-XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M
резервирует больше места для скомпилированного кода. Все разделы должны «сложиться» в ReservedCodeCacheSize
. Я наблюдал, как модифицированный Minecraft достигает ограничения по умолчанию в 250 мегабайт с помощью XX:+PrintCodeCache
, но даже если он не заполнен, больший размер делает вытеснение скомпилированного кода менее агрессивным.-XX:NmethodSweepActivity=1
(по умолчанию 10) сохраняет «холодный» код в кеше в течение более длительного времени. Риска «заполнения» кэша кода также нет, поскольку холодный код удаляется более агрессивно по мере заполнения.-XX:+UseStringDeduplication
-XX:+UseFastUnorderedTimeStamps
Избегайте системных вызовов для получения времени. Влияние этого будет варьироваться в зависимости от системы, но нас не особо заботит точность регистрации временных меток.-XX:+UseCriticalJavaThreadPriority
Ничто не должно вытеснять потоки Minecraft. Потоки GC и компилятора могут подождать.-XX:ThreadPriorityPolicy=1
Использовать более широкий диапазон приоритетов потоков. Для работы требуется sudo в Linux. Некоторые JDK (например, Graal) включают это по умолчанию, но некоторые нет.-XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150
: оптимизирует параллельные потоки сбора G1GC, все еще тестируется: https://research.spec.org/icpe_proceedings/2014/p111.pdf-XX:G1RSetUpdatingPauseTimePercent=0
: мы хотим, чтобы вся эта работа выполнялась в параллельных потоках G1GC, а не в паузах.-XX:G1HeapWastePercent=18
Не беспокойтесь о сборе отходов старого поколения, пока его процент не превысит этот процент. Это позволяет избежать запуска более медленных «смешанных» сборщиков мусора молодого поколения, и это нормально, поскольку Minecraft (с достаточным объемом памяти) не заполняет старое поколение так быстро. Идея взята: https://www.reddit.com/r/Minecraft/comments/k9zb7m/tuning_jvm_gc_for_singleplayer/-XX:GCTimeRatio=99
Цель: 1% процессорного времени должен тратиться на сбор мусора. По умолчанию — 12, что кажется слишком низким. По умолчанию для Java 8 было 99.-XX:AllocatePrefetchStyle=3
Генерировать одну инструкцию предварительной выборки для каждой строки кэша. Более агрессивная предварительная выборка обычно полезна на новых процессорах с большими кэшами. Кажется, сломался ZGC. См.: https://github.com/openjdk/jdk/blob/bd90c4cfa63ba2de26f7482ed5d1704f9be9629f/src/hotspot/share/opto/macro.cpp#L1806.-Dgraal.LoopRotation=true
Оптимизация не по умолчанию, вероятно, скоро станет стандартной.-Dgraal.TuneInlinerExploration=1
Тратьте больше времени на принятие решений по встраиванию. Для Minecraft мы хотим, чтобы компилятор C2 был как можно более медленным и агрессивным.-Dgraal
включены по умолчанию и используются либо для проверки работоспособности, для отладки, либо для обеспечения безопасности (если, например, кто-то по незнанию отключает JVCMI с помощью какого-либо другого флага).-XX:MaxInlineLevel=15 -XX:MaxVectorSize=32
) просто копируются из значений по умолчанию Java 17. Другие (например +AggressiveOpts
) не являются значениями по умолчанию только в некоторых старых сборках Java 8.-Dgraal.BaseTargetSpending=160
(по умолчанию 120) в Graal и некоторых других флагов в OpenJDK. От этого могут выиграть процессоры с большим кэшем.-XX:+AlignVector -XX:+OptoBundling -XX:+OptimizeFill -XX:+AlwaysCompileLoopMethods -XX:+EnableVectorAggressiveReboxing -XX:+EnableVectorSupport -XX:+OptoScheduling -XX:+UseCharacterCompareIntrinsics -XX:+UseCopySignIntrinsic -XX:+UseVectorStubs
-Dgraal.LSRAOptimization=true
-Dgraal.OptWriteMotion=true
и graal.WriteableCodeCache=true
, которые не кажутся стабильными, но могут быть более стабильными в GraalVM 22.3.0G1HeapWastePercent
.-XX:+PrintFlagsFinal
и -XX:+JVMCIPrintProperties
для вывода описаний/значений флагов по умолчанию.