Привет! В LumeX мы отлично знаем ситуацию, когда ты ставишь Purpur, приводишь конфиги в порядок, убираешь ненужные плагины… а сервер всё равно периодически «задумывается». TPS падает, игроки жалуются, лаги никуда не делись.
Часто проблема скрывается глубже - не в плагинах, а в том, как запускается Java. Сегодня поговорим о мощном, но часто недооценённом инструменте - флагах запуска JVM.
Что за флаги такие
Представь стройку. Плагины - это внутренняя отделка и мебель. А флаги запуска - это правила, по которым работает фундамент. Они говорят Java, сколько памяти взять, как её распределять, как и когда очищать.
Большинство хостингов и инструкций запускают сервер с минимальными настройками: указали объём памяти - и всё. Java при этом работает по умолчанию, а умолчания рассчитаны на обычные программы, а не на игровой сервер, который должен 20 раз в секунду быстро обрабатывать мир.
В Minecraft-среде давно признан «золотым стандартом» набор Aikar's Flags. Это не плагин, а тщательно выверенный комплект параметров запуска, который проверен на тысячах серверов.
🗑 Главный источник лагов - сборщик мусора
Пока сервер работает, он постоянно создаёт и выбрасывает объекты в памяти: блоки, сущности, пакеты, события. Чтобы память не закончилась, Java периодически запускает сборщик мусора (Garbage Collector, GC), который находит ненужные объекты и освобождает место.
Проблема в том, как он это делает. Некоторые алгоритмы сборки мусора на время работы останавливают всю программу. Это называется «Stop-the-World» - пауза, во время которой сервер ничего не обрабатывает. Если пауза длится доли секунды, игроки видят резкий фриз: мобы замирают, блоки не ломаются, а потом всё резко «догоняет». Чем больше памяти и мусора, тем длиннее такие паузы.
Что делают флаги Aikar
Флаги Aikar переводят Java на современный сборщик мусора G1GC и тонко настраивают его под Minecraft. G1 очищает память небольшими порциями, стараясь уложиться в заданное время, и делает это без длинных остановок. Сервер получает короткие, предсказуемые паузы вместо редких, но болезненных фризов.
Кроме того, флаги заранее выделяют всю память при запуске и настраивают, как разделять «молодые» и «старые» объекты. Для Minecraft это особенно важно: большая часть мусора - короткоживущие объекты, которые появляются и исчезают за один тик, и их выгоднее убирать быстро и часто.
Как это выглядит на практике
Вот рекомендуемый набор флагов. Не забудь заменить 10G на свой объём памяти:
java -Xms10G -Xmx10G -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
Выглядит пугающе, но разбираться в каждом параметре не обязательно. Важно понимать три главных. Параметры -Xms и -Xmx задают минимальный и максимальный объём памяти, и их делают одинаковыми: так Java не тратит силы на постоянное изменение размера памяти. Флаг -XX:+UseG1GC включает современный сборщик мусора G1. А -XX:MaxGCPauseMillis=200 задаёт цель для длительности пауз, чтобы сборщик старался не устраивать долгих остановок.
Для серверов с большим объёмом памяти, примерно от 12 ГБ, автор флагов рекомендует немного другие значения нескольких параметров - их можно найти в оригинальном описании Aikar's Flags.
Частые ошибки
Первая ошибка - выделить серверу всю память машины. Операционной системе и самой Java тоже нужна память за пределами указанного объёма. Если отдать серверу всё, машина начнёт использовать файл подкачки, и лаги станут только хуже. Оставляй запас в пару гигабайт.
Вторая ошибка - выделять слишком много «на всякий случай». Больше памяти - не всегда лучше: сборщику мусора приходится обрабатывать больший объём, и при неправильных настройках паузы становятся длиннее. Давай серверу столько, сколько ему реально нужно, плюс разумный запас.
Третья - копировать флаги со случайных форумов. Многие «секретные» наборы устарели или противоречат друг другу. Флаги Aikar проверены годами и остаются надёжной основой.
Что ты получаешь
С правильными флагами резкие лаг-спайки заметно снижаются, TPS становится выше и стабильнее, а паузы Stop-the-World почти исчезают. Сервер работает плавнее даже под нагрузкой. Иногда одна строка в запуске даёт больше, чем десяток оптимизационных плагинов.
Проверить эффект легко: сними профиль spark до и после смены флагов и сравни, как часто и как долго работает сборщик мусора.
Как проверить, помогли ли флаги
Не верь на слово ни нам, ни другим гайдам - проверяй. Перед сменой флагов сними профиль spark под обычной нагрузкой и посмотри раздел о сборщике мусора: как часто он запускается и сколько длятся паузы. Потом смени флаги, перезапусти сервер и через несколько часов работы с игроками сними профиль ещё раз. Если паузы стали короче, а TPS стабильнее, флаги сработали.
Если же разницы нет, значит, проблема не в памяти. Лаги могут давать тяжёлые плагины, генерация мира, фермы игроков или слабый процессор. Флаги - важная часть оптимизации, но не волшебная кнопка от всех проблем.
Если сервер на хостинге
На многих игровых хостингах нельзя напрямую поменять строку запуска. Но часто в панели есть поле для дополнительных параметров Java или готовая галочка «Aikar's Flags». Если ничего такого нет, напиши в поддержку хостинга - многие включают правильные флаги по запросу. А если хостинг отказывается и сервер тормозит, это повод задуматься о переезде на VDS, где всё под твоим контролем.
Версия Java тоже важна
Флаги работают на современных версиях Java. Новые версии Minecraft требуют свежую Java, и она сама по себе обычно быстрее старых. Если сервер работает на устаревшей Java, обновление может дать прирост ещё до того, как ты тронешь флаги.
А ты уже пробовал Aikar's Flags? Или используешь собственные настройки JVM? Пиши в комментариях!



