TeaHost
Minecraftminecraftоптимизацияjvm5 мин. чтения

Xmx и Xms: выделение памяти серверу Minecraft

Xmx и Xms на сервере Minecraft: сколько памяти выделять под ваниль и модпаки, почему Xms равен Xmx и как диагностировать OutOfMemoryError.

Кратко

Ставьте -Xms равным -Xmx и оставляйте 15–20% памяти тарифа вне кучи: на 4 ГБ — -Xmx3G, на 6 ГБ — -Xmx5G, на 8 ГБ — -Xmx6G–7G. На ванили 2 ГБ рассчитаны примерно на 5 игроков, 4 ГБ — на 15, 6 ГБ — на 25, 8 ГБ — на 40, 16 ГБ — на 100; плагины и моды примерно вдвое снижают эти цифры. Утечки ищите через /spark heapsummary до того, как добавлять память.

Два параметра -Xmx и -Xms определяют, сколько оперативной памяти получит Java-машина под сервер Minecraft. Ошибки здесь дают два противоположных симптома: при слишком малом значении сервер падает с OutOfMemoryError, при слишком большом — начинает подвисать, потому что сборщику мусора приходится обходить гигантскую кучу. Разберу, как выбрать значение под свой тариф и сборку.

Что означают Xmx и Xms для сервера Minecraft

  • -Xmx — максимальный размер кучи (heap). Верхняя граница, выше которой JVM память не возьмёт.
  • -Xms — начальный размер кучи. Столько выделяется сразу при старте.

Записываются с суффиксом G или M:

код
java -Xms4G -Xmx4G -jar server.jar nogui

Оба флага ставятся до -jar. После -jar они игнорируются — частая причина того, что «настройка не применилась».

Почему Xms должен равняться Xmx

Стандартный совет из старых гайдов — ставить -Xms1G -Xmx6G, чтобы «сервер брал память по необходимости». Для Minecraft это плохая идея.

Каждое расширение кучи с 1 до 6 ГБ — это остановка JVM. На старте сервера, когда грузятся плагины и генерируются чанки, таких расширений будет несколько десятков, и каждое видно игрокам как рывок. Плюс сборщик мусора настраивает свои внутренние параметры под текущий размер кучи и постоянно их пересчитывает.

Правильно:

код
-Xms6G -Xmx6G

Память резервируется один раз при старте, дальше JVM работает в стабильных условиях. Вместе с флагом -XX:+AlwaysPreTouch из набора Aikar это убирает целый класс микрофризов — сам набор разобран в статье про Aikar's flags.

Сколько выделять: ориентиры

Ориентиры даны по памяти тарифа и совпадают со шкалой на странице тарифов: свежий мир, view-distance 8–10. Плагины и моды примерно удваивают расход памяти, поэтому с ними тот же объём держит заметно меньше людей. Значение -Xmx — с запасом вне кучи, о нём ниже.

Память тарифаВаниль, Paper без плагиновС плагинами или модами-Xmx
2 ГБдо 5 игроковтолько ваниль-Xmx1600M
4 ГБдо 15до 5-Xmx3G
6 ГБдо 25до 10-Xmx5G
8 ГБдо 40до 15-Xmx6G–-Xmx7G
12 ГБдо 70до 25-Xmx10G
16 ГБдо 100до 40-Xmx13G
24 ГБ150 и большедо 70-Xmx20G

Fabric с оптимизационными модами расходует память экономнее Forge при том же числе модов. Тяжёлые сборки на 150+ модов вроде All the Mods ориентируйте на нижние строки колонки «с модами» — от 12 ГБ. После 100–150 игроков на одном сервере эффективнее разбить проект на несколько серверов за прокси.

Развёрнутые расчёты с учётом плагинов и размера карты — в статье сколько RAM нужно Minecraft-серверу.

Оставьте запас вне кучи

Главная ошибка при аренде: тариф на 4 ГБ, а в параметрах стоит -Xmx4G. Java берёт под кучу не всю доступную память — сверх -Xmx уходит:

  • Metaspace под классы плагинов и модов: 100–500 МБ
  • Стеки потоков: около 1 МБ на поток, потоков десятки
  • Прямые буферы под сетевой стек: сотни мегабайт при большом онлайне
  • Сама операционная система, если сервер на VPS

Практическое правило: -Xmx = 80–85% от доступной памяти. Готовые значения для каждого объёма — в колонке -Xmx таблицы выше.

Если выставить -Xmx в потолок тарифа, процесс рано или поздно убьёт OOM-killer системы — сервер просто исчезнет из консоли без внятной ошибки в логе.

Почему «больше» не значит «лучше»

Дать серверу на 15 человек 16 ГБ вместо 4 — не ускорение. С правильными флагами G1 спокойно работает с большой кучей, и PaperMC в описании Aikar's flags прямо пишет, что после определённого объёма прирост прекращается: лишние гигабайты просто лежат без дела, а вы за них платите.

Признак избыточной памяти: в /spark healthreport использование кучи стабильно ниже 30% и почти не растёт — половина выделенного не используется.

Признак нехватки: использование постоянно у потолка, GC срабатывает несколько раз в секунду, TPS плавает. Тогда память добавлять надо.

Где менять параметры

В панели управления. Обычно память задаётся ползунком тарифа, а флаги — отдельным полем (Java Flags, JVM Arguments, «Параметры запуска»). При смене тарифа -Xmx часто подставляется автоматически.

В скрипте запуска. Файл start.sh:

код
#!/bin/bash
java -Xms6G -Xmx6G -XX:+UseG1GC -jar paper.jar nogui

В systemd-юните. Строка ExecStart — как это оформить, описано в статье про автозапуск через systemd и screen.

После правки нужен полный рестарт: параметры JVM читаются только при старте процесса.

Проверка текущего значения

Через профилировщик прямо в игре:

код
/spark healthreport

Строка вида Memory: 3.2 GB / 6.0 GB показывает использование и лимит.

Через консоль сервера с root-доступом:

код
ps aux | grep java

В выводе будут видны фактические флаги запущенного процесса. Если там не то, что вы прописали, значит панель переопределяет параметры или скрипт запускает другой файл.

OutOfMemoryError: что делать

Ошибка в логе выглядит так:

код
java.lang.OutOfMemoryError: Java heap space

Порядок разбора:

  1. Посмотрите, когда это происходит. Сразу после старта — мало памяти под сборку. Через несколько часов работы — вероятна утечка.
  2. Проверьте размер мира. Карта на 30 ГБ с бесконтрольным исследованием тянет память чанками. Помогает ворлдборд и предгенерация.
  3. Найдите виновника. /spark heapsummary покажет, какие классы занимают больше всего. Часто это конкретный плагин или тысячи энтити одного типа.
  4. Считайте энтити. Ферма на 5000 предметов в одном чанке съест любой объём. Лимиты правятся в конфигах — разбор в разделах про bukkit.yml и spigot.yml.
  5. Только потом добавляйте память. Если причина в утечке, увеличение -Xmx лишь отодвигает падение на несколько часов.

Общий разбор проблем со стартом — в статье сервер Minecraft не запускается, а причины лагов — в материале про просадки TPS.

Память и производительность: что важнее

Частое заблуждение — что TPS зависит от объёма памяти. Не зависит, пока памяти достаточно. Minecraft упирается в однопоточную производительность процессора: тик мира считается в одном потоке, и никакие гигабайты этого не изменят.

Память нужна, чтобы:

  • Держать загруженные чанки без постоянной перезагрузки с диска
  • Вмещать плагины, моды и их данные
  • Дать сборщику пространство для манёвра

Как только эти условия выполнены, дальнейшее увеличение ничего не даёт. Что действительно решает — разобрано в статье про процессор для игрового сервера.

Чек-лист

  • -Xms равен -Xmx
  • Оба флага стоят до -jar
  • -Xmx не превышает 85% доступной памяти тарифа
  • Значение соответствует типу сборки, а не «взято с запасом»
  • После правки был полный рестарт, а не /reload
  • /spark healthreport показывает использование кучи в диапазоне 40–75%

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