Флаги Aikar и тюнинг JVM/G1GC для сервера Minecraft
Полный разбор флагов Aikar для Minecraft-сервера: G1GC, -Xms/-Xmx, Java 17/21, ZGC и замер пауз GC. Готовая строка запуска.
Кратко: Флаги Aikar - это набор JVM-параметров для сборщика мусора G1GC, которые снижают паузы и TPS-просадки на Minecraft-сервере. Достаточно скопировать готовую строку из статьи, подставить нужный объём RAM и перезапустить сервер.
Флаги Aikar и тюнинг JVM/G1GC для сервера Minecraft
Minecraft-сервер работает на Java, а значит его производительность напрямую зависит от того, как настроена виртуальная машина. По умолчанию JVM использует консервативные параметры, рассчитанные на широкий спектр приложений, но не на игровой сервер с тысячами объектов в памяти и жёсткими требованиями к задержкам. Результат - периодические “заморозки” на 500 мс и более, когда сборщик мусора решает прибраться. Aikar (один из ключевых разработчиков Paper) опубликовал набор флагов, которые решают эту проблему. В 2026 году эти флаги стали индустриальным стандартом и применяются на большинстве публичных серверов.
Pterohost - игровой хостинг для Minecraft с NVMe-дисками, защитой от DDoS и поддержкой 24/7. Промокод 4START даёт -20% на первый заказ. Заказать Minecraft хостинг
Что такое G1GC и почему стандартные настройки не подходят
Java использует автоматическое управление памятью через сборщик мусора (Garbage Collector, GC). Когда объекты в куче (Heap) больше не нужны, GC освобождает память. Проблема в том, что некоторые фазы GC требуют полной остановки всех потоков приложения - это называется Stop-The-World (STW) пауза. Для Minecraft это критично: STW на 300-500 мс означает видимый фриз для всех игроков.
G1GC (Garbage-First Garbage Collector) - сборщик мусора, доступный в Java 9+ и ставший стандартным с Java 9. Он делит кучу на регионы и собирает их по приоритету, что позволяет ограничить максимальное время паузы. Но без дополнительной настройки G1GC всё равно работает не оптимально для Minecraft - слишком большие регионы, неправильные пороги срабатывания.
Флаги Aikar точно настраивают G1GC под паттерн использования памяти в Minecraft:
- Много короткоживущих объектов (позиции, пакеты, задачи тиков)
- Периодические всплески выделения памяти (загрузка чанков)
- Постоянное давление на старое поколение (кешированные чанки, плагины)
Готовая строка запуска с флагами Aikar
Ниже - актуальная строка для Java 17/21 с 8 ГБ RAM. Замените 8G на нужный объём:
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
Для удобного использования в скрипте запуска - однострочный вариант:
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
Если у вас больше 12 ГБ RAM, используйте расширенную версию с увеличенными размерами регионов:
# Для кучи 12 ГБ и выше - увеличить G1HeapRegionSize до 16M
-XX:G1HeapRegionSize=16M
Разбор каждого флага
Основные параметры памяти
-Xms8G -Xmx8G - начальный и максимальный размер кучи. Они ДОЛЖНЫ быть равны. Если -Xms меньше -Xmx, JVM начинает с малого значения и расширяет кучу по мере необходимости. Каждое расширение - дополнительный GC-цикл и потеря времени. Фиксируя оба значения одинаковыми, мы заставляем JVM выделить всю память сразу при старте (-XX:+AlwaysPreTouch закрепляет страницы в физической памяти, исключая page fault во время игры).
-XX:+UseG1GC - явно включает G1GC. В Java 9+ он включён по умолчанию, но явное указание исключает случайные переключения при изменении настроек JVM.
Параметры пауз и регионов G1GC
-XX:MaxGCPauseMillis=200 - целевое максимальное время паузы в миллисекундах. G1GC постарается не превышать этот порог. Значение 200 мс - компромисс между частотой и длительностью пауз. Можно попробовать 100 мс, но это увеличит накладные расходы на GC.
-XX:G1NewSizePercent=30 и -XX:G1MaxNewSizePercent=40 - минимальный и максимальный процент кучи, отводимый под молодое поколение. По умолчанию JVM выделяет слишком мало под молодое поколение, что вызывает частые Minor GC. Для Minecraft, который генерирует огромное количество короткоживущих объектов, 30-40% - оптимальный диапазон.
-XX:G1HeapRegionSize=8M - размер одного региона G1GC. По умолчанию JVM вычисляет его автоматически (обычно 1-4 МБ для кучи 4-8 ГБ), что слишком мало для Minecraft. Регион 8 МБ снижает количество регионов и накладные расходы на управление ими. При куче от 12 ГБ используйте 16 МБ.
-XX:InitiatingHeapOccupancyPercent=15 - порог заполнения старого поколения, при котором запускается concurrent marking (15% вместо стандартных 45%). Это даёт GC больше времени для подготовки и снижает вероятность Full GC.
Флаги оптимизации процесса сборки
-XX:G1MixedGCCountTarget=4 - количество смешанных GC-циклов для очистки старого поколения. Меньшее значение означает более агрессивную очистку за меньшее количество пауз.
-XX:G1MixedGCLiveThresholdPercent=90 - регион старого поколения будет включён в смешанный GC только если живых объектов в нём меньше 90%. Это позволяет пропускать сильно заполненные регионы, которые дорого собирать.
-XX:G1HeapWastePercent=5 - допустимый процент “мусора” в куче до того, как G1GC начнёт смешанный цикл.
-XX:G1ReservePercent=20 - резервирует 20% кучи как буфер для продвижения объектов. Снижает вероятность провала продвижения и связанных Full GC.
-XX:G1RSetUpdatingPauseTimePercent=5 - ограничивает долю паузы на обновление remembered sets до 5%.
-XX:SurvivorRatio=32 - соотношение Eden к Survivor в молодом поколении. Большое значение означает меньшие Survivor-пространства, что соответствует паттерну Minecraft с быстро умирающими объектами.
-XX:MaxTenuringThreshold=1 - объекты переводятся в старое поколение уже после 1 выживания Minor GC (вместо 15 по умолчанию). Для Minecraft это лучше: выжившие объекты обычно долгоживущие.
Прочие флаги производительности
-XX:+ParallelRefProcEnabled - параллельная обработка ссылок (soft/weak/phantom references) во время GC. Minecraft активно использует слабые ссылки в кешах.
-XX:+DisableExplicitGC - запрещает вызов System.gc() из кода плагинов. Некоторые плагины вызывают его в неподходящий момент, что провоцирует Full GC.
-XX:+AlwaysPreTouch - при старте JVM сразу записывает нули во все выделенные страницы памяти. Устраняет page fault во время игры ценой немного более долгого старта.
-XX:+UnlockExperimentalVMOptions - разрешает использование экспериментальных флагов JVM. Нужен для некоторых параметров G1GC.
-XX:+PerfDisableSharedMem - отключает запись данных производительности в файл в /tmp/hsperfdata_*. Снижает нагрузку на диск, убирает риски I/O-задержек из-за этих файлов.
Сколько RAM выделять серверу
Самая частая ошибка - выдавать серверу всю доступную память. Это контрпродуктивно.
| RAM сервера (VPS/dedi) | Рекомендуемый -Xmx | Остаток для ОС и JVM |
|---|---|---|
| 4 ГБ | 2-2.5 ГБ | 1.5-2 ГБ |
| 8 ГБ | 6 ГБ | 2 ГБ |
| 16 ГБ | 12-13 ГБ | 3-4 ГБ |
| 32 ГБ | 26-28 ГБ | 4-6 ГБ |
Почему нельзя отдавать всё:
- Сам JVM-процесс использует память вне кучи: Metaspace (метаданные классов), стеки потоков (~1 МБ на поток, у Minecraft 50-100+ потоков), буферы JIT-компилятора
- ОС нужен кеш файловой системы - без него чтение/запись чанков замедляется
- При нехватке памяти ОС начинает свапировать, что в тысячи раз хуже любого GC
Метаspace: Если сервер использует много модов/плагинов, добавьте -XX:MaxMetaspaceSize=512m (или 256m для чистых серверов). По умолчанию Metaspace неограничен и может незаметно поглощать память.
Выбор версии Java в 2026 году
| Версия Minecraft | Минимальная Java | Рекомендуемая Java |
|---|---|---|
| 1.8 - 1.16 | Java 8 | Java 11 (осторожно с модами) |
| 1.17 - 1.20.4 | Java 17 | Java 17 LTS |
| 1.20.5+ / 1.21+ | Java 21 | Java 21 LTS |
Java 21 LTS - текущий рекомендованный выбор для новых серверов. Она принесла виртуальные потоки (Project Loom), улучшенный G1GC и ZGC. Дистрибутив: Eclipse Temurin 21 (бесплатный, от Adoptium) или GraalVM 21 Community Edition (даёт дополнительный прирост через JIT-компилятор).
Установка Temurin 21 на Debian/Ubuntu:
wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor -o /etc/apt/trusted.gpg.d/adoptium.gpg
echo "deb https://packages.adoptium.net/artifactory/deb $(lsb_release -cs) main" > /etc/apt/sources.list.d/adoptium.list
apt update && apt install temurin-21-jdk
java -version
ZGC как альтернатива G1GC
Z Garbage Collector (ZGC) - конкурентный сборщик с паузами менее 1 мс, доступен в Java 15+ (production-ready с Java 17). В Java 21 ZGC значительно улучшен (Generational ZGC).
Когда стоит рассматривать ZGC:
- Куча от 8-12 ГБ и выше
- Java 21
- Регулярные STW-паузы более 200 мс при G1GC
- Достаточно CPU-ядер (ZGC активнее использует CPU)
Строка запуска с Generational ZGC (Java 21):
java -Xms12G -Xmx12G \
-XX:+UseZGC \
-XX:+ZGenerational \
-XX:+AlwaysPreTouch \
-XX:+DisableExplicitGC \
-XX:+PerfDisableSharedMem \
-XX:MaxMetaspaceSize=512m \
-jar server.jar nogui
Флаги Aikar для G1GC при ZGC не применяются - у ZGC своя архитектура. Флаги -XX:G1* с ZGC игнорируются или вызывают ошибку.
Важно: ZGC требует больше памяти для собственных структур данных. На куче 8 ГБ реально под объекты приложения доступно примерно 6.5-7 ГБ.
Как замерить паузы GC и убедиться в эффективности
Добавьте в строку запуска флаги логирования GC:
-Xlog:gc*:file=/path/to/logs/gc.log::filecount=5,filesize=10m
Это создаст ротируемый лог сборок мусора. Анализ:
Вариант 1 - GCEasy (онлайн): Загрузите gc.log на gceasy.io - бесплатный анализ с графиками пауз, throughput и рекомендациями.
Вариант 2 - GCViewer (Java-приложение): Скачайте с GitHub, откройте gc.log, смотрите на:
- “Max Pause” - должно быть ниже 200 мс
- “Avg Pause” - желательно ниже 50 мс
- “GC Overhead” - доля времени в GC, норма до 3-5%
- Наличие Full GC (G1 Full GC) - должно быть 0 или единицы за сессию
Вариант 3 - в консоли через grep:
grep "GC pause" /path/to/logs/gc.log | grep -v "concurrent" | awk '{print $NF}' | sort -t'(' -k2 -rn | head -20
Эта команда выведет 20 самых долгих STW-пауз.
Быстрая проверка через Spark (плагин): Если у вас установлен Spark - популярный профайлер для Minecraft-серверов, достаточно выполнить в консоли:
/spark gcmonitor
Spark выводит уведомления в чат при каждой GC-паузе с её длительностью.
Типичные ошибки при настройке JVM
1. Разные -Xms и -Xmx
Самая частая ошибка у начинающих. -Xms512M -Xmx8G - JVM стартует с 512 МБ и постепенно расширяется, провоцируя GC при каждом расширении.
2. Слишком большая куча без необходимости Куча 30 ГБ на сервере с 20 игроками - не лучше, чем 8 ГБ. G1GC обрабатывает большую кучу дольше, Mixed GC-паузы растут. Начните с разумного значения (6-10 ГБ для средней нагрузки) и увеличивайте, если видите OutOfMemoryError или постоянное давление GC.
3. Флаги G1GC с неподходящей версией Java
Некоторые флаги Aikar требуют -XX:+UnlockExperimentalVMOptions в Java 11, но стали стандартными в Java 17/21. Использование устаревших флагов не сломает сервер, но может выводить предупреждения в консоль.
4. Смешивание флагов G1GC и ZGC
Нельзя использовать -XX:+UseZGC и -XX:G1NewSizePercent=30 одновременно. Выберите один сборщик.
5. Плагин вызывает System.gc()
Флаг -XX:+DisableExplicitGC блокирует эти вызовы. Если плагин жалуется, что не может освободить память - это баг в плагине, а не причина убирать этот флаг.
Пример итогового скрипта запуска
Готовый start.sh для продакшен-сервера на Java 21 с 8 ГБ RAM:
#!/bin/bash
JAVA_PATH=/usr/bin/java
SERVER_JAR=paper-1.21.4.jar
RAM=8G
$JAVA_PATH \
-Xms${RAM} \
-Xmx${RAM} \
-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 \
-XX:MaxMetaspaceSize=512m \
-Xlog:gc*:file=logs/gc.log::filecount=5,filesize=10m \
-Dusing.aikars.flags=https://mcflags.emc.gs \
-Daikars.new.flags=true \
-jar ${SERVER_JAR} nogui
Сделайте файл исполняемым и запускайте:
chmod +x start.sh
./start.sh
Связанные материалы
Флаги JVM - только один из инструментов оптимизации. Читайте также: оптимизация сервера Minecraft для настройки paper.yml и bukkit.yml, устранение лагов на сервере Minecraft с диагностикой через Spark и Timings, а также выбор ядра для Minecraft-сервера - правильное ядро даёт прирост производительности без каких-либо настроек JVM.
Заключение
Флаги Aikar - обязательная базовая настройка для любого Minecraft-сервера на Java. Они не требуют специальных знаний: достаточно скопировать строку запуска, подставить нужный объём RAM и убедиться, что используется Java 17 или 21. После включения флагов большинство серверов замечают снижение TPS-просадок и исчезновение характерных “фризов” на 200-500 мс. Для серверов с кучей от 12 ГБ на Java 21 стоит дополнительно рассмотреть Generational ZGC - он обеспечивает паузы менее 1 мс. Независимо от выбранного сборщика, настройте логирование GC и периодически проверяйте статистику через GCEasy или Spark.
Pterohost - хостинг Minecraft-серверов с NVMe-хранилищем, защитой от DDoS и круглосуточной технической поддержкой. Все тарифы поддерживают Java 17/21 и кастомные флаги запуска. Промокод 4START даёт -20% на первый заказ. Заказать Minecraft хостинг