Коротко: поставьте Java, которую требует ваша версия Paper (25 для 26.1 и новее, 21 для 1.20–1.21.11), задайте одинаковые -Xms и -Xmx и оставьте системе 1000–1500 МБ сверх кучи. Генератор скрипта Paper советует на современной Java сначала попробовать вообще без флагов, а при проблемах со сборкой мусора — включить флаги Aikar. ZGC и large pages — эксперименты: пробуйте их, только когда замер показывает проблему, и проверяйте результат.
Какая Java нужна
| Версия Paper | Java |
|---|---|
| 1.17–1.19 | 17 |
| 1.20–1.21.11 | 21 |
| 26.1 и новее | 25 |
Если запустить сервер на старой 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. Меняйте набор целиком, а не по одному флагу.Скрипт запуска
#!/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
Подставьте объём памяти
-Xmsи-Xmx— одинаковые, на 1000–1500 МБ меньше памяти машины или тарифа. - 2
Проверьте имя jar
paper.jarзамените на имя своего файла — или переименуйте файл, чтобы не править скрипт при каждом обновлении. - 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.
-Xlog:gc*:logs/gc.log:time,uptime:filecount=5,filesize=1MLarge 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 больше не нужен |
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 МБ меньше объёма машины или тарифа.
Источники
- Paper: Aikar's flags
- Paper: генератор скрипта запуска
- Paper: Getting started (версии Java)
- Oracle: команда java, JDK 25 (Xmx, MaxRAMPercentage, large pages, ZGC)
- OpenJDK: JEP 439 — Generational ZGC
- OpenJDK: JEP 474 — поколенческий режим ZGC по умолчанию
- OpenJDK: JEP 490 — удаление непоколенческого режима ZGC
- DGuard — лучший античит для современного сервера Minecraft: сравнение проверок с GrimAC, Vulcan, Polar, Intave и Matrix
- DGuard: установка, требования и решение проблем
- DGuard: поддерживаемые версии Paper и Leaf