Minecraft: OutOfMemoryError — что делать и как не угадывать

Сервер падает с OutOfMemoryError или Exit code 137. Разбираем, какая это память, как проверить лимит и -Xmx и когда помогает только тариф.

Команда EGN 9 мин чтения
Minecraft: OutOfMemoryError — что делать и как не угадывать
Содержание 14
  1. Коротко
  2. Шаги
  3. Пример: как выглядит нехватка памяти
  4. Что на самом деле занимает память
  5. Что записать перед изменениями
  6. Симптом → причина → решение
  7. Как сделать в панели EGN
  8. Частые ошибки
  9. Вопросы и ответы
  10. Можно ли решить OutOfMemoryError одной настройкой?
  11. Сколько памяти дать Minecraft-серверу?
  12. Почему сервер падает с Exit code 137?
  13. Что значит GC overhead limit exceeded?
  14. Итог

Сервер Minecraft падает посреди игры, а в логе стоит java.lang.OutOfMemoryError. Первое желание понятно: добавить памяти. Иногда это правильное решение, но часто оно ничего не меняет. Ошибка с таким названием может означать три разные вещи, и каждая лечится по-своему. В этой статье разберём, как понять, что именно закончилось, и что сделать в панели EGN.

Коротко

OutOfMemoryError: Java heap space значит, что закончилась куча Java. Её размер задаёт флаг -Xmx в разделе «Запуск». Если в консоли сервер просто исчезает с кодом Exit code 137 и строкой Out of memory: true, его остановила операционная система, потому что процесс вышел за лимит памяти тарифа. Сначала определите, какая это ошибка, и только потом меняйте -Xmx или тариф.

Шаги

  1. Найдите строку ошибки. Откройте «Файлы», папку logs/ и файл latest.log. Поищите слово OutOfMemory или откройте последние строки консоли. Если сервер уже упал, загляните в папку crash-reports/: там лежит отчёт с трассировкой и пометкой о памяти.

  2. Определите тип ошибки. Вариантов немного:

    • java.lang.OutOfMemoryError: Java heap space — закончилась куча, та самая часть памяти, которую задаёт -Xmx;
    • java.lang.OutOfMemoryError: GC overhead limit exceeded — сборщик мусора работает почти всё время и почти ничего не освобождает, по сути память тоже кончилась;
    • java.lang.OutOfMemoryError: Metaspace — закончилась память под описания классов; обычно это признак большого количества модов;
    • в логе нет OutOfMemoryError, но есть Exit code 137 — процесс убит системой (сигналом SIGKILL) из-за лимита тарифа.
  3. Посмотрите лимит и текущий -Xmx. Лимит памяти тарифа и пик за неделю виден в карточке услуги в кабинете, в блоке «Нагрузка»; текущее потребление — на графике памяти в «Консоли». Флаги Java задаются в разделе «Запуск»: там строка вида -Xms2G -Xmx4G (это пример, у вас будет своё значение). Сравните эти два числа.

  4. Проверьте, что -Xmx меньше лимита. Память процесса Java — это не только куча. Рядом живут Metaspace, потоки, буферы и сама JVM. Если поставить -Xmx равным лимиту тарифа, система убьёт процесс раньше, чем JVM успеет выбросить OutOfMemoryError, и вы получите Exit code 137 вместо понятного сообщения. Пример: на тарифе с 4 ГБ -Xmx4G — высокий риск падения с кодом 137, -Xmx3G оставляет запас. Точную цифру подбирайте по графику памяти, а не по одной ошибке.

    Доктор сервера показывает причину: процесс упёрся в память

    Доктор сервера в консоли показывает эту же картину: «Серверу не хватило памяти», код выхода 137 и строка Out of memory: true. Кнопка «Запустить и проследить» перезапускает сервер и смотрит консоль заново.

  5. Если причина в куче (Java heap space). Уберите то, что съедает память: лишние моды, большие предгенерированные миры, слишком большой view-distance. Если сборка без этого не работает, поднимайте и лимит, и -Xmx вместе, сохраняя запас.

  6. Если причина в системе (Exit code 137). Когда -Xmx уже разумный, а сервер всё равно убивают, помогает только тариф с большим объёмом памяти. Увеличить ресурсы можно в кабинете; доплата считается за остаток срока.

  7. Перезапустите и смотрите график. После изменений запустите сервер и через день-два посмотрите блок «Нагрузка» за неделю. Если память держится у лимита выше 85–90 %, запас всё ещё мал.

Пример: как выглядит нехватка памяти

Вот пример графика из тестового кабинета за семь дней (данные стенда, не боевые). Тариф с 2 ГБ, пик памяти — 93 % от лимита, а выше 88 % она держалась шесть часов подряд.

Блок «Нагрузка» за неделю: память у лимита 2,0 ГБ
Блок «Нагрузка» за неделю: память у лимита 2,0 ГБ

Такой график говорит не о «багах игры», а о том, что сервер живёт на краю лимита. В такой ситуации сохранения растягиваются, игроки вылетают, а при пике процесс может уйти в OOM. Вывод простой: либо меньше памяти уходит на моды и мир, либо тариф больше.

Что на самом деле занимает память

Схема ниже показывает, что входит в память процесса. Важно видеть, что -Xmx — только один кусок из общего лимита.

Из чего складывается память процесса Java
Из чего складывается память процесса Java

Поэтому правило «поставлю -Xmx побольше и всё заработает» не работает. Куча может быть почти пустой, а процесс всё равно убьют, если в сумме памяти больше, чем разрешил тариф. И наоборот: куча может быть заполнена, а лимит ещё далеко, тогда нужно увеличить -Xmx, а не тариф.

Что записать перед изменениями

Прежде чем менять -Xmx или тариф, запишите пять вещей: версию игры и ядра (например, Paper 1.21.4), число модов или плагинов, лимит памяти тарифа, текущие флаги из «Запуска» и точный текст ошибки. Через неделю это поможет понять, какое изменение дало эффект, а поддержке сэкономит время, если понадобится помощь.

Текст ошибки можно найти прямо в логе. Если у вас есть доступ к файлам по SFTP или через панель, выполните поиск:

Терминал
grep -n -i "outofmemory\|out of memory" logs/latest.log | head -20
ls -la crash-reports/

Первая команда покажет строки с упоминанием памяти и их номера, вторая — отчёты о падении. Номера строк полезны: первое упоминание обычно и есть причина.

Отдельно о флагах -Xms и -Xmx. -Xms задаёт начальный размер кучи, -Xmx — максимальный. Большой -Xms сразу резервирует память под кучу. На слабом тарифе это может привести к падению раньше, чем вы ожидаете. Если не уверены, оставьте -Xms меньше или равным -Xmx и не выставляйте его выше лимита.

Ещё одна деталь: лимит тарифа считается на весь процесс целиком, а не только на кучу. Если в «Нагрузке» память упирается в лимит, даже при скромном -Xmx сервер может быть остановлен системой, потому что кроме кучи в память входят Metaspace, стеки потоков и собственные буферы JVM. Поэтому смотрите не только на кучу, а на весь график.

Заметка

Сколько оставлять запаса. Жёсткого правила нет: чем больше модов и плагинов, тем больше нужно места вне кучи. Ориентир для старта — -Xmx на четверть-пятую часть меньше лимита тарифа, дальше подбирайте по графику. Это ориентир, а не гарантия.

Симптом → причина → решение

Симптом в логе или панели Вероятная причина Что делать
OutOfMemoryError: Java heap space Куча заполнена, -Xmx мал для сборки Поднять -Xmx с запасом под лимит, убрать тяжёлые моды
GC overhead limit exceeded Живых данных больше кучи, GC работает почти постоянно То же, плюс уменьшить предгенерацию и view-distance
OutOfMemoryError: Metaspace Очень много классов от модов Меньше модов или тариф с большей памятью
Exit code 137, Out of memory: true Система убила процесс за лимит тарифа -Xmx меньше лимита, затем тариф больше
Память у лимита неделю, падения днём Сервер живёт на краю памяти Тариф с большим объёмом памяти

Таблица нужна не для того, чтобы угадать, а чтобы сузить варианты. Сначала совпадает симптом, затем проверяете причину по логу, и только потом меняете настройку.

Как сделать в панели EGN

  1. Откройте карточку услуги в кабинете: блок «Нагрузка» покажет память за сутки или неделю, лимит тарифа и пик. Текущее потребление видно и на странице «Консоль» в панели.
  2. Если сервер упал, доктор сервера в консоли сам покажет причину: для памяти это карточка «Серверу не хватило памяти».
  3. Откройте «Запуск» и проверьте флаги Java: -Xmx должен быть меньше лимита из «Нагрузки».
  4. Измените значение, сохраните и запустите сервер кнопкой «Запустить и проследить», если она есть в карточке доктора. Она запускает сервер и смотрит консоль заново.
  5. Через сутки откройте график за неделю и сравните с прошлым периодом.
Доктор сервера: процесс упёрся в лимит памяти
Доктор сервера: процесс упёрся в лимит памяти

На скриншоте доктор показывает три шага, которые совпадают с этим разделом: убрать тяжёлые моды, проверить -Xmx в «Запуске» и при стабильном упоре в память увеличить тариф. Доплата за увеличение считается за остаток срока.

Частые ошибки

  • Ставить -Xmx равным всему лимиту. Так вы рискуете получить Exit code 137 вместо понятной ошибки.
  • Поднимать -Xmx без роста тарифа. Если лимит 2 ГБ, а -Xmx стоит 4 ГБ, JVM не получит обещанного, и система всё равно её остановит.
  • Смотреть только на последнюю строку. Причина часто выше: за ней идёт вторичная ошибка. Поищите первое упоминание OutOfMemory в логе.
  • Лечить память удалением мира. Мир тут ни при чём, а сорванные сохранения могут стоить вам прогресса. Сделайте бэкап через «Бэкапы», прежде чем что-то удалять.
  • Не смотреть на моды. Тяжёлые моды и сборки с сотнями модов тратят много Metaspace и кучи. Если ошибка появилась после установки мода, откатите его и проверьте снова.

Вопросы и ответы

Можно ли решить OutOfMemoryError одной настройкой?

Иногда да, если -Xmx выставлен меньше, чем нужно сборке, или больше лимита тарифа. Если сборка действительно требует больше памяти, одной настройкой не обойтись: нужен тариф.

Сколько памяти дать Minecraft-серверу?

Ориентируйтесь на график памяти за неделю, а не на число из статьи. Если пики постоянно выше 85–90 % лимита, памяти мало. Для сборок с сотнями модов памяти обычно нужно заметно больше, чем для ванильного сервера.

Почему сервер падает с Exit code 137?

Код 137 означает, что процесс убит сигналом SIGKILL. Чаще всего так делает система, когда процесс вышел за лимит памяти тарифа. Проверьте -Xmx и график памяти.

Что значит GC overhead limit exceeded?

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

Итог

OutOfMemoryError — это не одна проблема, а несколько. Сначала определите тип ошибки по логу: куча, Metaspace или код 137 от системы. Затем сравните -Xmx с лимитом тарифа и оставьте запас. Если память держится у лимита, а -Xmx разумный, решение одно — больший тариф. Похожие разборы смотрите в статьях про Java-версию, про лаги и про чек-лист запуска.

Сервер под Minecraft за пару минут — egnetwork.ru

Читать далее

Вся рубрика →