Pterohost docs

Флаги 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.16Java 8Java 11 (осторожно с модами)
1.17 - 1.20.4Java 17Java 17 LTS
1.20.5+ / 1.21+Java 21Java 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 хостинг