Если вы играете в Minecraft и хотите избавиться от надоедливых лагов, связанных с паузами сборщика мусора, то Shenandoah GC — ваш потенциальный герой. В этом посте вы узнаете, как включить Shenandoah в JVM для Minecraft, какие ключевые механизмы стоят за его минимальными паузами, и как правильно настроить его под реальные нагрузки. Приготовьтесь к погружению в мир конкурентной сборки мусора с яркими примерами и понятными объяснениями!


Почему Shenandoah — это сборщик мусора мечты для Minecraft

Shenandoah GC — это сборщик мусора для OpenJDK, который минимизирует время пауз, не зависящее от размера кучи. Представьте, что у вас куча размером в 200 МБ или 200 ГБ — паузы будут одинаково короткими! Это достигается за счёт конкурентной работы сборщика, который выполняет эвакуацию и обновление ссылок параллельно с работой приложения.

В Minecraft, где отзывчивость и плавность важны, Shenandoah помогает избежать "заморозок" игры из-за сборки мусора. Он особенно полезен для серверов и клиентов с большими объемами памяти.


Как Shenandoah достигает коротких пауз

Основная магия Shenandoah — это использование указателей перенаправления (indirection pointers) для каждого объекта. К каждому объекту добавляется дополнительный указатель, который всегда указывает на актуальное местоположение объекта, даже если он перемещён в процессе сборки мусора.

Это позволяет сборщику перемещать объекты в куче параллельно с работой приложения, не останавливая его надолго. Если поток хочет прочитать объект, он просто идёт по указателю перенаправления. Если хочет изменить объект, он сначала переносит его в новое место, а потом меняет.

Такой подход основан на принципах, описанных Родни Бруксом — пионером реалтайм-сборщиков мусора.


Основные фазы работы Shenandoah GC

Чтобы понять, как включить и настроить Shenandoah, полезно знать, что происходит внутри. Вот основные фазы сборки мусора:

Фаза Описание Тип паузы
Init Mark Инициация маркировки, сканирование корневого набора. Первая пауза STW (Stop-The-World). Короткая STW
Concurrent Marking Конкурентное сканирование кучи для поиска достижимых объектов. Конкурентная
Final Mark Завершение маркировки, повторное сканирование корней, подготовка к эвакуации. Короткая STW
Concurrent Evacuation Перенос живых объектов из очищаемых регионов в новые регионы. Конкурентная
Init Update Refs Короткая пауза для подготовки к обновлению ссылок. Очень короткая STW
Concurrent Update Refs Обновление ссылок на перемещённые объекты. Конкурентная
Final Update Refs Завершение обновления ссылок, повторное сканирование корней. Короткая STW
Concurrent Cleanup Очистка и освобождение регионов, полностью свободных от живых объектов. Конкурентная

Как включить Shenandoah в Minecraft JVM

Чтобы включить Shenandoah GC при запуске Minecraft, нужно добавить в параметры JVM следующие опции:

java -XX:+UseShenandoahGC -jar minecraft.jar

Для более продвинутой настройки рекомендуется использовать такой набор флагов:

java -XX:+UseShenandoahGC \
     -XX:+UnlockExperimentalVMOptions \
     -XX:ShenandoahGCHeuristics=adaptive \
     -XX:+AlwaysPreTouch \
     -Xms4G -Xmx4G \
     -jar minecraft.jar
  • -XX:+UseShenandoahGC — включает Shenandoah.
  • -XX:+UnlockExperimentalVMOptions — разблокирует экспериментальные опции.
  • -XX:ShenandoahGCHeuristics=adaptive — адаптивный режим, который подстраивается под нагрузку.
  • -XX:+AlwaysPreTouch — заранее выделяет всю память, что снижает задержки при работе.
  • -Xms4G -Xmx4G — задаёт фиксированный размер кучи (4 ГБ в примере).

Что такое ShenandoahGCHeuristics и как выбрать режим

Параметр ShenandoahGCHeuristics управляет стратегией запуска сборок мусора:

Режим Описание Когда использовать
adaptive По умолчанию, автоматически подстраивается под нагрузку, балансируя паузы и ресурсы. Для большинства приложений, включая Minecraft
static Запускает сборку при достижении определённого процента заполнения кучи. Если нужна предсказуемость запуска GC
compact Постоянно собирает мусор, сразу после предыдущей сборки. Для отладки или специфических задач
aggressive Постоянная сборка с удалением даже живых объектов. Используется только для отладки. Не рекомендуется для продакшена

Важные параметры для тонкой настройки

Параметр Что делает Рекомендации по настройке
ShenandoahFreeThreshold Процент свободной памяти после сборки, при котором GC не запускается Обычно 20%, можно увеличить для снижения частоты сборок
ShenandoahAllocationThreshold Порог заполнения кучи для запуска сборки мусора Около 60%, регулирует чувствительность GC
ShenandoahGarbageThreshold Процент мусора в куче, при достижении которого начинается сборка Около 20%, помогает избежать накопления мусора
ShenandoahUncommitDelay Задержка перед освобождением неиспользуемой памяти (в мс) По умолчанию 1000 мс, можно уменьшить для быстрого возврата памяти

Организация кучи и регионы

Shenandoah разбивает кучу на множество регионов одинакового размера. Каждый регион может быть:

  • Занят живыми объектами и не подлежащим очистке.
  • Занят живыми объектами, но подлежащим очистке.
  • Зарезервирован для перемещения объектов.
  • Свободен.

Громадные объекты (humongous objects), которые не помещаются в один регион, занимают несколько регионов подряд.


Практические советы по настройке Minecraft с Shenandoah

  • Фиксируйте размер кучи с помощью -Xms и -Xmx, чтобы избежать динамического расширения, которое может вызвать паузы.
  • Используйте -XX:+AlwaysPreTouch, чтобы JVM заранее выделила всю память, снижая задержки при старте.
  • Настройте ShenandoahGCHeuristics=adaptive для автоматической подстройки под нагрузку Minecraft.
  • Следите за метриками: время пауз, количество эвакуируемых регионов, использование CPU и памяти.
  • Если наблюдаются падения производительности, попробуйте увеличить ShenandoahFreeThreshold или уменьшить ShenandoahUncommitDelay.
  • Для серверов Minecraft с большим количеством игроков и плагинов Shenandoah помогает сохранить отзывчивость.

Сравнение Shenandoah с другими сборщиками

Параметр Shenandoah G1 Parallel GC CMS Serial GC
Время пауз Короткие, не зависят от размера кучи Короткие, растут с размером кучи Зависит от размера кучи Короткие, но возможны задержки Долгие, зависят от размера кучи
Конкурентность Высокая, большинство фаз конкурентные Частично конкурентный Нет Частично конкурентный Нет
Использование CPU Высокое Среднее Высокое Среднее Низкое
Подходит для Больших куч, приложений с низкими паузами Больших куч, умеренных пауз Многопоточных приложений Приложений с умеренными требованиями Маленьких приложений

Важные моменты при миграции на Shenandoah

  • Тестируйте приложение с Shenandoah на тестовых нагрузках.
  • Профилируйте время пауз и использование ресурсов.
  • Сравнивайте с текущим сборщиком мусора.
  • Обратите внимание на Failure Mode — если сборщик не успевает за приложением, он может перейти в режим Degenerated GC с увеличенными паузами.
  • Настраивайте параметры эвристик и порогов под специфику Minecraft.

Эксперименты в Legacy Launcher для Minecraft

В Minecraft через Legacy Launcher доступны эксперименты, которые позволяют включать Shenandoah и другие сборщики мусора:

  • Файл конфигурации обычно находится в .tlauncher/legacy.properties или tl.properties.
  • В строке experiments.available перечислены доступные эксперименты, включая shenandoah.
  • В строке experiments.enabled через точку с запятой указываются включённые эксперименты, например:
experiments.enabled=shenandoah
  • Для работы экспериментов нужно включить "оптимизированные аргументы" в лаунчере.
  • Shenandoah требует Java 11 или новее.

Итог

Shenandoah — это сборщик мусора, который идеально подходит для Minecraft, если вы хотите минимизировать паузы и повысить отзывчивость игры. Включить его просто — достаточно добавить -XX:+UseShenandoahGC в параметры JVM. Для оптимальной работы используйте адаптивные эвристики и фиксируйте размер кучи.

Не забывайте тестировать и мониторить метрики, чтобы подобрать настройки под вашу конкретную нагрузку. Shenandoah мощный инструмент для тех, кто ценит плавность и минимальные задержки.


Полезные ссылки


Погрузитесь в настройку Shenandoah и забудьте о лагучих паузах в Minecraft! Ваш мир станет плавнее, а игра — приятнее.