DGuard

Флаги JVM для сервера Minecraft: что ставить и зачем

Команда запуска сервера — это версия Java, объём памяти и, по желанию, настройки сборщика мусора. Разбираем, что советует документация Paper: одинаковые -Xms и -Xmx, флаги Aikar для G1 и что делает каждый из них, а также когда есть смысл пробовать large pages и ZGC.

Команда DGuard8 мин

Коротко: поставьте Java, которую требует ваша версия Paper (25 для 26.1 и новее, 21 для 1.20–1.21.11), задайте одинаковые -Xms и -Xmx и оставьте системе 1000–1500 МБ сверх кучи. Генератор скрипта Paper советует на современной Java сначала попробовать вообще без флагов, а при проблемах со сборкой мусора — включить флаги Aikar. ZGC и large pages — эксперименты: пробуйте их, только когда замер показывает проблему, и проверяйте результат.

Какая Java нужна

Версия PaperJava
1.17–1.1917
1.20–1.21.1121
26.1 и новее25
По таблице Getting started в документации Paper

Если запустить сервер на старой Java, он упадёт с UnsupportedClassVersionError — разбор в статье логи и краши. Как поставить Java на Ubuntu или Debian — в статье сервер на Linux.

Память: -Xms, -Xmx и запас

  • `-Xmx` — потолок кучи, `-Xms` — сколько выделить при старте. Документация Paper просит ставить их одинаковыми: сервер всё равно должен рассчитывать на весь -Xmx, а память между ними просто простаивает. G1 работает тем лучше, чем больше памяти ему дали.
  • Не отдавайте куче всю память. Процессу Java нужно больше, чем -Xmx: Paper советует уменьшать его на 1000–1500 МБ от объёма машины или тарифа — при 8 ГБ около 6500 МБ. Иначе процесс может убить OOM killer.
  • Без `-Xmx` Java выберет потолок сама — по умолчанию 25 % доступной памяти (-XX:MaxRAMPercentage). Для сервера это обычно мало, поэтому задавайте объём явно. В Docker-образе itzg/minecraft-server это делает переменная MEMORY — см. сервер в Docker.

Сколько памяти нужно под ваш онлайн и как проверить расход — в отдельной статье сколько RAM нужно серверу.

Флаги Aikar: что делает каждый

Флаги Aikar — набор настроек сборщика мусора G1 под нагрузку Minecraft. Тот же набор подставляет генератор скрипта запуска PaperMC. По документации Paper, Minecraft выделяет память очень быстро — на сервере с 30 игроками от 800 МБ в секунду, в основном короткоживущие объекты, — и флаги рассчитаны на то, чтобы такие объекты умирали молодыми и не засоряли старое поколение.

ФлагЗачем, по документации Paper
-XX:+UseG1GCвыбирает сборщик G1; остальные флаги — его настройки
-XX:+UnlockExperimentalVMOptionsоткрывает часть флагов ниже
-XX:G1NewSizePercent=30, -XX:G1MaxNewSizePercent=40больше места молодому поколению, чтобы сборки молодых объектов шли реже
-XX:MaxTenuringThreshold=1, -XX:SurvivorRatio=32временные данные не переезжают в старое поколение, а освободившееся место отдаётся новым объектам
-XX:G1ReservePercent=20запас памяти против нехватки места при копировании объектов (по умолчанию 10)
-XX:G1HeapRegionSize=8Mкрупнее регионы: объекты от половины региона считаются «огромными» и сразу идут в старое поколение
-XX:MaxGCPauseMillis=200цель паузы сборщика — не больше 200 мс, то есть около 4 тиков
-XX:+DisableExplicitGCзапрещает плагинам вызывать полную сборку мусора, которая даёт сильный фриз
-XX:+AlwaysPreTouchрезервирует и размечает всю кучу при старте, а не по мере роста
-XX:+ParallelRefProcEnabledобработка слабых ссылок в несколько потоков
-XX:G1MixedGCLiveThresholdPercent=90, -XX:G1MixedGCCountTarget=4, -XX:G1RSetUpdatingPauseTimePercent=5старое поколение чистится понемногу и чаще, меньше работы внутри паузы
-XX:+PerfDisableSharedMemубирает запись статистики JVM в файл, которая даёт задержки при нагруженном диске
Ещё в наборе -XX:InitiatingHeapOccupancyPercent=15, -XX:G1HeapWastePercent=5 и метки -Dusing.aikars.flags, -Daikars.new.flags. Меняйте набор целиком, а не по одному флагу.

Скрипт запуска

start.sh для Linux: флаги Aikar и автоперезапуск, как в генераторе PaperMC
#!/usr/bin/env sh
# машина или тариф на 8 ГБ: куче 6500 МБ, остальное — самой Java и системе
while [ true ]; do
    java -Xms6500M -Xmx6500M -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+ParallelRefProcEnabled -XX:+PerfDisableSharedMem -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:G1HeapWastePercent=5 -XX:G1MaxNewSizePercent=40 -XX:G1MixedGCCountTarget=4 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1NewSizePercent=30 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=15 -XX:MaxGCPauseMillis=200 -XX:MaxTenuringThreshold=1 -XX:SurvivorRatio=32 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar paper.jar --nogui
    echo Server restarting...
    echo Press CTRL + C to stop.
done
  1. 1

    Подставьте объём памяти

    -Xms и -Xmx — одинаковые, на 1000–1500 МБ меньше памяти машины или тарифа.

  2. 2

    Проверьте имя jar

    paper.jar замените на имя своего файла — или переименуйте файл, чтобы не править скрипт при каждом обновлении.

  3. 3

    Сделайте скрипт исполняемым

    chmod +x start.sh, затем ./start.sh. Цикл while перезапускает сервер после stop или падения; остановить совсем — Ctrl+C в консоли.

Если сервер запускает systemd с Restart=always, цикл не нужен — достаточно одной строки exec java ..., как в статье сервер на Linux. Для Velocity генератор предлагает свой, короткий набор: -XX:+AlwaysPreTouch -XX:+ParallelRefProcEnabled -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1HeapRegionSize=4M -XX:MaxInlineLevel=15.

Лог сборщика мусора

Чтобы понять, виноват ли сборщик во фризах, включите его лог. По документации Paper он не влияет на производительность и занимает около 5 МБ, поэтому его можно не выключать. Для Java 11 и новее добавьте в команду запуска флаг ниже. Быстрее посмотреть сборки можно встроенным spark: /spark gc — история сборок, /spark gcmonitor — наблюдение за ними, подробнее в статье профайлер spark.

Лог GC — пишется в logs/gc.log, до 5 файлов по 1 МБ
-Xlog:gc*:logs/gc.log:time,uptime:filecount=5,filesize=1M

Large pages и transparent huge pages

Большие страницы памяти уменьшают нагрузку на кэш адресов процессора, и приложениям с большой памятью это может помочь. Но документация Oracle предупреждает: закреплённая под них память может отнять обычную у остальных программ, а на долго работающей системе из-за фрагментации её может не хватить — тогда JVM вернётся к обычным страницам.

  • `-XX:+UseLargePages` — настоящие большие страницы, по умолчанию выключены. На Linux их нужно заранее выделить в системе (nr_hugepages); проверить поддержку — grep Huge /proc/meminfo.
  • `-XX:+UseTransparentHugePages` — только Linux, страницы, которые система выделяет сама. Oracle называет опцию экспериментальной, Paper — спорной: пробовать, если нельзя настроить настоящие large pages, и обязательно вместе с -XX:+AlwaysPreTouch. PaperMC пишет, что не измеряла, как это влияет на Minecraft.

ZGC: когда можно попробовать

ZGC — сборщик с низкими задержками: по документации Oracle, его паузы — несколько миллисекунд и не зависят от размера кучи, но ценой части пропускной способности. Он работает хорошо, пока у машины хватает памяти и процессора, чтобы освобождать память быстрее, чем её занимает приложение, — так пишут в JEP 439. В документации Paper о ZGC ничего нет — она советует G1, без флагов или с флагами Aikar, — поэтому ZGC остаётся экспериментом для тех, у кого G1 даёт заметные паузы, а свободные ядра есть.

JavaКак включить поколенческий ZGC
21-XX:+UseZGC -XX:+ZGenerational — без второго флага включится старый, непоколенческий режим
23-XX:+UseZGC — поколенческий режим включён по умолчанию
24 и новее, в том числе 25-XX:+UseZGC — непоколенческий режим удалён, флаг -XX:+ZGenerational больше не нужен
По JEP 439 (Java 21), JEP 474 (Java 23) и JEP 490 (Java 24)
Java 25: ZGC вместо G1 — флаги Aikar с ним не нужны
java -Xms6500M -Xmx6500M -XX:+UseZGC -jar paper.jar --nogui

Флаги Aikar — настройки G1, поэтому с ZGC их не смешивайте: выберите один сборщик. Сравнивайте честно — тот же онлайн, /spark tps и лог GC до и после, — и возвращайтесь к G1, если стало хуже.

Флаги JVM и античит

Долгие паузы сборщика мусора — это фризы для всех игроков, а проверки, завязанные на время, во время фризов видят то, чего не было. DGuard — лучший античит для современного сервера Minecraft — копит улики из нескольких эпизодов и не наказывает за одно странное мгновение. Для него ничего не нужно добавлять в команду запуска: ключ лежит в plugins/DGuard/config.yml, а проверки идут в сетевых потоках — на основном потоке это 0,03 % одного ядра. Работает на Paper и Leaf версий 1.21–26.3, с той Java, которую требует ваша версия сервера.

Частые вопросы

Нужны ли флаги Aikar на Java 21 или 25?

Не обязательно. Генератор скрипта Paper советует на современной Java сначала попробовать без флагов, а флаги Aikar включать при проблемах со сборкой мусора.

Почему -Xms должен быть равен -Xmx?

Так советует документация Paper: сервер всё равно должен рассчитывать на весь -Xmx, а память между -Xms и -Xmx простаивает. G1 работает лучше, когда памяти ему дали сразу.

Какая Java нужна для Minecraft 26.x?

Java 25: по документации Paper она нужна для 26.1 и новее. Для 1.20–1.21.11 — Java 21.

ZGC лучше G1 для сервера Minecraft?

Документация Paper этого не утверждает: она советует G1 — без флагов или с флагами Aikar. ZGC даёт короткие паузы ценой части пропускной способности; пробуйте его как эксперимент и сравнивайте замерами.

Можно ли отдать Java всю память сервера?

Нет. Процессу Java нужно больше, чем -Xmx, и системе тоже нужна память. Paper советует ставить -Xmx на 1000–1500 МБ меньше объёма машины или тарифа.

Источники

Все разделы
Создание сервера6 минСколько памяти нужно серверу MinecraftУниверсального числа «на N игроков» нет: расход памяти зависит от онлайна, дальности прорисовки, плагинов и того, сколько мира загружено одновременно. Документация Paper начинает с 4 ГБ, а на странице флагов Aikar советует 6–10 ГБ при любом онлайне. Дальше — замеряйте spark и добавляйте память, только если её действительно не хватает.ЧитатьАдминистрирование6 минСервер Minecraft на Linux: установка на VPS с автозапускомНа VPS с Ubuntu или Debian сервер Minecraft ставится за полчаса: Java из репозитория Amazon Corretto, отдельный пользователь без прав root, Paper, консоль в tmux и юнит systemd, который поднимает сервер после перезагрузки и корректно выключает его командой stop.ЧитатьАдминистрирование4 минСервер Minecraft в Docker: образ itzg/minecraft-serverDocker упаковывает сервер вместе с нужной Java: один compose-файл описывает ядро, версию, память и порт, а данные лежат в обычной папке на хосте. Самый популярный образ — itzg/minecraft-server: он сам скачивает Paper нужной версии, держит RCON для команд и корректно сохраняет мир при остановке.Читать

Поставьте лучший античит для современного Minecraft

DGuard ловит все 47 видов читов из нашего сравнения — у ближайшего соперника, Intave, 27. Полная защита на любом тарифе, до 30 игроков онлайн — бесплатно.