Флаги запуска Java для сервера Minecraft: почему -Xmx8G мало

Один флаг -Xmx8G сам по себе не делает сервер быстрым — он только задаёт потолок памяти, которую Java может использовать под кучу. Стабильность и отсутствие фризов зависят ещё от того, как выставлен стартовый размер кучи и каким сборщиком мусора Java эту кучу обслуживает. Разбираем по порядку, что и зачем настраивать.
Что такое куча Java и почему один -Xmx не решает всё

Куча (heap) — область памяти, где Java хранит все объекты во время работы: сущности, чанки, данные плагинов. -Xmx задаёт верхний предел этой области, -Xms — стартовый размер. Если задать только -Xmx, JVM по умолчанию стартует с маленькой кучи и постепенно расширяет её до потолка по мере необходимости — и каждое такое расширение это пауза, которую заметят игроки.
Зачем выравнивать Xms и Xmx
Когда стартовый и максимальный размер кучи совпадают, JVM сразу резервирует всю память целиком и больше не тратит время на изменение размера кучи в процессе работы. Это убирает целый класс микрофризов, связанных именно с ресайзом, и делает поведение сервера предсказуемее. Правило простое: для сервера Minecraft Xms и Xmx стоит выставлять одинаковыми.
Что делает сборщик мусора и почему он вызывает фризы
Сборщик мусора (GC) периодически проходит по куче и освобождает память от объектов, которые сервер больше не использует. На небольшой куче эти проходы быстрые и почти незаметны. На большой куче без правильной настройки GC может устраивать длинные паузы «стой и жди» (stop-the-world) — именно они ощущаются игроками как резкий фриз на секунду и больше. Современный стандартный сборщик G1GC умеет работать инкрементально и держать паузы короткими, но для этого ему нужны правильно выставленные параметры, а не значения по умолчанию.
Флаги Aikar: что они реально делают
Набор флагов, известный как флаги Aikar, — это не магическое заклинание, а набор параметров именно для G1GC, подобранных под нагрузку игровых серверов. Смысл не в том, чтобы скопировать строку целиком не глядя, а в том, чтобы понимать, за что отвечает каждый параметр.
- MaxGCPauseMillis — целевая длина паузы сборщика, к которой G1GC старается стремиться при каждом проходе
- G1NewSizePercent и G1MaxNewSizePercent — какую долю кучи отдать под молодое поколение объектов, где живут короткоживущие сущности и временные данные
- G1HeapRegionSize — размер региона, на которые G1GC делит кучу для более гибкой сборки мусора
- InitiatingHeapOccupancyPercent — при каком заполнении кучи GC начинает сборку старого поколения заранее, не дожидаясь критического момента
java -Xms8G -Xmx8G -XX:+UseG1GC -XX:+ParallelRefProcEnabled \ -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions \ -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 \ -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M \ -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 \ -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 \ -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 \ -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem \ -XX:MaxTenuringThreshold=1 -jar server.jar --nogui
Java 21 для версии 1.21.x — не опция, а требование
Начиная с обновлений вокруг 1.20.5 и далее для всей линейки 1.21.x, Mojang требует Java 21 — на более старых версиях Java сервер попросту не запустится. Перед настройкой флагов проверь, какая версия Java установлена на машине (java -version), и при необходимости обнови её. Флаги, о которых шла речь выше, рассчитаны на современный G1GC и корректно работают на Java 21.
Чего делать не стоит
- Копировать флаги из старых гайдов, рассчитанных на давно устаревшие версии Java — часть таких флагов сегодня либо ничего не даёт, либо не распознаётся современной JVM
- Использовать параметры для сборщика CMS — он был объявлен устаревшим ещё в Java 9 и полностью удалён из современных версий Java
- Отдавать серверу всю доступную память машины под -Xmx — операционной системе и самой Java нужна память сверх кучи, иначе стабильности не будет
- Менять значения флагов наугад без понимания, за что они отвечают — на конкретной сборке плагинов или модов оптимальные значения могут отличаться
Один нюанс, про который забывают: этот набор рассчитан на кучу примерно до 12 ГБ. Если отдаёшь серверу больше, у Aikar меняются четыре значения — G1NewSizePercent становится 40, G1MaxNewSizePercent 50, G1HeapRegionSize 16M, а G1ReservePercent опускается до 15, InitiatingHeapOccupancyPercent поднимается до 20. Скопировать набор для 8 ГБ на машину с 32 ГБ — не ошибка, которая всё сломает, но и пользы от флагов будет меньше, чем могло быть.
Что почитать дальше: Кончилась память: OOM killer.

Хостинг Minecraft от 349 ₽ в месяц
Ryzen 9 7950X до 5,7 ГГц на ядро, бэкапы каждый день, моды и карты из панели.
Выбрать тарифЧастые вопросы
Обязательно ли использовать именно флаги Aikar? Нет, это не единственно верный набор, а проверенная временем отправная точка под G1GC. Если понимаешь, что делаешь, можно настраивать параметры под свою нагрузку отдельно. Что если сервер не запускается после смены Java? Скорее всего стоит версия Java ниже требуемой для твоей версии Minecraft — проверь java -version и обнови JRE до Java 21 для 1.21.x.



