JVM флаги Minecraft (известные как Aikar's flags) — это набор аргументов запуска Java, который настраивает сборщик мусора так, чтобы сервер не «замирал» на доли секунды каждые несколько минут. Простой запуск через java -Xmx оставляет настройки по умолчанию, и именно они дают плавающий TPS и фризы. Готовая строка флагов, инструкция по применению и реалистичные ожидания — ниже.
Почему дефолтный запуск сервера тормозит
Minecraft-сервер написан на Java и работает внутри JVM — виртуальной машины, которая сама управляет памятью. Объекты (чанки, сущности, предметы) постоянно создаются и удаляются, а освобождением памяти занимается сборщик мусора (Garbage Collector, GC). Современная Java по умолчанию использует сборщик G1GC, и он неплох — но его настройки по умолчанию рассчитаны на «средний» серверный софт, а не на игровой цикл, который обязан укладываться в 50 мс на тик.
Главная боль — это stop-the-world паузы. Чтобы безопасно убрать мусор, GC на короткое время останавливает все рабочие потоки сервера. Если такая пауза затянулась на 150–300 мс, главный поток не успел обработать тик, и ты видишь классический фриз: мобы дёргаются, блоки ставятся с задержкой, игроков «откатывает». В консоли это часто выглядит как строки вида Can't keep up! Is the server overloaded?.
Если ты собираешь сервер с нуля, держи это в голове ещё на этапе настройки — гайд как создать сервер Minecraft описывает базу, а флаги — следующий слой оптимизации поверх неё.
TPS (ticks per second) — сколько игровых тиков сервер успевает за секунду; идеал — 20. MSPT (milliseconds per tick) — сколько миллисекунд занимает один тик; пока MSPT ниже 50 мс, TPS держится на 20. Длинная GC-пауза мгновенно выбивает один тик за пределы 50 мс — это и есть фриз.
Что делают Aikar's flags
Aikar's flags — это выверенный набор аргументов JVM от разработчика Paper по нику Aikar. Идея простая: вместо того чтобы давать G1GC копить мусор и потом убирать его большими «рывками», флаги заставляют сборщик работать чаще, но мелкими порциями. Каждая отдельная пауза получается короткой и предсказуемой, цель по паузе жёстко задана в 200 мс, а на практике большинство пауз укладывается в единицы–десятки миллисекунд.
Ключевые принципы, которые зашиты в этот набор:
- -Xms равно -Xmx. Java не тратит время на постепенное «доращивание» кучи и сразу резервирует весь объём — память не скачет, паузы стабильнее.
- Раннее выделение памяти (
AlwaysPreTouch). Вся куча трогается при старте, а не лениво во время игры, когда это вызвало бы микрозадержки. - Большой young-генерейшен (
G1NewSizePercent=30,G1MaxNewSizePercent=40). Под аллокационный паттерн Minecraft это резко снижает частоту дорогих сборок. - Параллельная обработка ссылок (
ParallelRefProcEnabled) и отключение явного GC (DisableExplicitGC), чтобы кривой плагин не дёргал полную сборку вызовомSystem.gc().
Полная строка JVM флагов Minecraft
Ниже — актуальная строка Aikar's flags. Меняй только два значения — -Xms и -Xmx (они должны быть равны), всё остальное оставь как есть. Пример показан для 8 ГБ кучи; подставь свой объём.
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 \
-Dusing.aikars.flags=https://mcflags.emc.gs \
-Daikars.new.flags=true \
-jar server.jar --nogui
Официальная рекомендация Aikar: если выделяешь серверу 12 ГБ и больше, увеличь размер региона до -XX:G1HeapRegionSize=16M и подними G1NewSizePercent до 40, а G1MaxNewSizePercent до 50. Для куч до 12 ГБ значения из строки выше оптимальны.
Как применить флаги
Куда именно вставлять эту строку — зависит от того, как у тебя запускается сервер.
В панели управления (Pterodactyl)
На Elysium сервер крутится в панели Pterodactyl, и большинство аргументов там уже выставлены в параметрах запуска. JVM-флаги задаются в переменной JVM Arguments (или в поле startup-команды) — туда вставляешь набор флагов -XX:... целиком, а -Xms/-Xmx панель обычно подставляет автоматически из выбранного лимита памяти. После сохранения просто перезапусти сервер, чтобы новая конфигурация подхватилась.
В стартовом скрипте (свой VPS)
Если ты запускаешь сервер вручную из start.sh или start.bat, вся строка целиком и есть твоя команда запуска. На Windows убери обратные слэши (\) — они нужны только для переноса строк в bash — и напиши команду в одну строку. Проверь, что используешь Java 17 или новее: на старых версиях часть экспериментальных флагов попросту не подхватится.
Не дублируй -Xmx и не оставляй старый флаг вроде -XX:+UseConcMarkSweepGC вместе с -XX:+UseG1GC — два сборщика мусора одновременно JVM не запустит, и сервер упадёт с ошибкой на старте. Всегда оставляй ровно один блок флагов.
Сколько RAM ставить в -Xms и -Xmx
Соблазн отдать серверу всю доступную память велик, но он вредит. Java расходует память сверх кучи: метапространство, стеки потоков, off-heap буферы NIO (через них как раз грузятся чанки). Плюс самой операционной системе нужен запас. Если выставить -Xmx в потолок физической памяти, под пиковой нагрузкой процесс упрётся в лимит и его убьёт OOM-killer.
| Память тарифа | Разумный -Xms=-Xmx | Под что подходит |
|---|---|---|
| 4 ГБ (Common) | 3 ГБ | Vanilla / Paper до 10–15 игроков |
| 6 ГБ (Pulse) | 5 ГБ | Paper с плагинами, лёгкие сборки |
| 8 ГБ (Nexus) | 6–7 ГБ | Средние модпаки, активное ядро |
| 12 ГБ (Apex) | 10 ГБ | Тяжёлые модпаки CurseForge/FTB |
| 16 ГБ (Titan) | 13–14 ГБ | Большие сборки, прокси-сети |
Главное правило: -Xms всегда равен -Xmx, и это не вся память сервера, а её часть с запасом 1–2 ГБ под систему. Если не уверен, сколько именно нужно твоей сборке, разбор есть в отдельном материале — сколько RAM нужно серверу Minecraft. И учти: на хостинге без оверселла, как у нас, выделенная память реально твоя — на тарифах Elysium это честная DDR5, а не «общая» оперативка, которую отбирают соседи.
Когда флаги уже не помогают
Aikar's flags решают одну конкретную задачу — фризы от сборки мусора. Если после их применения TPS всё равно проседает, а профайлер показывает высокий MSPT без заметных GC-пауз, то узкое место не в памяти, а в процессоре. Minecraft почти весь свой главный цикл считает в одном потоке, поэтому ему важна не «многоядерность», а высокая частота одного ядра.
Типичные причины упора в CPU: слишком большой view-distance, перегруженные хопперы и редстоун-фермы, тяжёлые моды, лишние плагины, сотни активных сущностей. Здесь флаги бессильны — нужно профилировать сервер (например, через spark) и убирать источник нагрузки. Полный разбор — в гайде почему лагает сервер и как починить. Выбор лёгкого ядра тоже сильно влияет: сравнение Paper, Purpur и Vanilla поможет понять, где можно выиграть тики без апгрейда железа.
Пара слов про ZGC
Для очень больших куч (ориентировочно от 12–16 ГБ) у G1 паузы начинают расти, и тогда имеет смысл присмотреться к сборщику ZGC (-XX:+UseZGC). Он рассчитан на паузы в доли миллисекунды почти независимо от размера кучи, но взамен берёт больше CPU и оперативки под служебные структуры. Для типового сервера на 4–10 ГБ это излишество — там Aikar's flags на G1GC остаются лучшим выбором. Ставить ZGC стоит осознанно и обязательно сравнивать TPS до и после на своей нагрузке.
Мифы о JVM-флагах
«Чем больше -Xmx, тем лучше». Нет. Большая куча — это больше памяти, которую сборщику нужно перелопатить за раз, то есть длиннее паузы. Выделяй ровно столько, сколько реально нужно сборке, плюс небольшой запас.
«Флаги заменят слабый хостинг». Тоже нет. Aikar's flags — это тонкая настройка поверх адекватного железа, а не его замена. Если у провайдера медленный диск и чанки подгружаются с задержкой, или ядро CPU слабое и одного потока не хватает, никакие флаги это не вылечат. Хорошая оптимизация начинается с правильного выбора площадки — об этом подробно в гайде как выбрать хостинг для Minecraft.
Aikar's flags дают максимум на железе с быстрым одним ядром и честной памятью. У нас это AMD Ryzen 9 с бустом 5.0+ ГГц, DDR5 без оверселла и NVMe Gen4 — мир и чанки читаются на скорости ~7 ГБ/с и не просаживают TPS во время сборки мусора. Собери сервер с нужным объёмом RAM и подходящим ядром, а флаги уже подставлены в панели — останется только запустить.
Итог простой: вставь проверенную строку флагов, выстави -Xms=-Xmx с запасом под систему, перезапусти сервер — и фризы от сборки мусора уйдут. Если же лаги остались, значит проблема в CPU или конфигурации, и дальше копать нужно уже там.