Minecraft: OutOfMemoryError — что делать и как не угадывать
Сервер падает с OutOfMemoryError или Exit code 137. Разбираем, какая это память, как проверить лимит и -Xmx и когда помогает только тариф.
Содержание 14
- Коротко
- Шаги
- Пример: как выглядит нехватка памяти
- Что на самом деле занимает память
- Что записать перед изменениями
- Симптом → причина → решение
- Как сделать в панели EGN
- Частые ошибки
- Вопросы и ответы
- Можно ли решить OutOfMemoryError одной настройкой?
- Сколько памяти дать Minecraft-серверу?
- Почему сервер падает с Exit code 137?
- Что значит GC overhead limit exceeded?
- Итог
Сервер Minecraft падает посреди игры, а в логе стоит java.lang.OutOfMemoryError. Первое желание понятно: добавить памяти. Иногда это правильное решение, но часто оно ничего не меняет. Ошибка с таким названием может означать три разные вещи, и каждая лечится по-своему. В этой статье разберём, как понять, что именно закончилось, и что сделать в панели EGN.
Коротко
OutOfMemoryError: Java heap space значит, что закончилась куча Java. Её размер задаёт флаг -Xmx в разделе «Запуск». Если в консоли сервер просто исчезает с кодом Exit code 137 и строкой Out of memory: true, его остановила операционная система, потому что процесс вышел за лимит памяти тарифа. Сначала определите, какая это ошибка, и только потом меняйте -Xmx или тариф.
Шаги
-
Найдите строку ошибки. Откройте «Файлы», папку
logs/и файлlatest.log. Поищите словоOutOfMemoryили откройте последние строки консоли. Если сервер уже упал, загляните в папкуcrash-reports/: там лежит отчёт с трассировкой и пометкой о памяти. -
Определите тип ошибки. Вариантов немного:
java.lang.OutOfMemoryError: Java heap space— закончилась куча, та самая часть памяти, которую задаёт-Xmx;java.lang.OutOfMemoryError: GC overhead limit exceeded— сборщик мусора работает почти всё время и почти ничего не освобождает, по сути память тоже кончилась;java.lang.OutOfMemoryError: Metaspace— закончилась память под описания классов; обычно это признак большого количества модов;- в логе нет OutOfMemoryError, но есть
Exit code 137— процесс убит системой (сигналом SIGKILL) из-за лимита тарифа.
-
Посмотрите лимит и текущий
-Xmx. Лимит памяти тарифа и пик за неделю виден в карточке услуги в кабинете, в блоке «Нагрузка»; текущее потребление — на графике памяти в «Консоли». Флаги Java задаются в разделе «Запуск»: там строка вида-Xms2G -Xmx4G(это пример, у вас будет своё значение). Сравните эти два числа. -
Проверьте, что
-Xmxменьше лимита. Память процесса Java — это не только куча. Рядом живут Metaspace, потоки, буферы и сама JVM. Если поставить-Xmxравным лимиту тарифа, система убьёт процесс раньше, чем JVM успеет выбросить OutOfMemoryError, и вы получитеExit code 137вместо понятного сообщения. Пример: на тарифе с 4 ГБ-Xmx4G— высокий риск падения с кодом 137,-Xmx3Gоставляет запас. Точную цифру подбирайте по графику памяти, а не по одной ошибке.Доктор сервера в консоли показывает эту же картину: «Серверу не хватило памяти», код выхода 137 и строка
Out of memory: true. Кнопка «Запустить и проследить» перезапускает сервер и смотрит консоль заново. -
Если причина в куче (
Java heap space). Уберите то, что съедает память: лишние моды, большие предгенерированные миры, слишком большойview-distance. Если сборка без этого не работает, поднимайте и лимит, и-Xmxвместе, сохраняя запас. -
Если причина в системе (
Exit code 137). Когда-Xmxуже разумный, а сервер всё равно убивают, помогает только тариф с большим объёмом памяти. Увеличить ресурсы можно в кабинете; доплата считается за остаток срока. -
Перезапустите и смотрите график. После изменений запустите сервер и через день-два посмотрите блок «Нагрузка» за неделю. Если память держится у лимита выше 85–90 %, запас всё ещё мал.
Пример: как выглядит нехватка памяти
Вот пример графика из тестового кабинета за семь дней (данные стенда, не боевые). Тариф с 2 ГБ, пик памяти — 93 % от лимита, а выше 88 % она держалась шесть часов подряд.
Такой график говорит не о «багах игры», а о том, что сервер живёт на краю лимита. В такой ситуации сохранения растягиваются, игроки вылетают, а при пике процесс может уйти в OOM. Вывод простой: либо меньше памяти уходит на моды и мир, либо тариф больше.
Что на самом деле занимает память
Схема ниже показывает, что входит в память процесса. Важно видеть, что -Xmx — только один кусок из общего лимита.
Поэтому правило «поставлю -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
- Откройте карточку услуги в кабинете: блок «Нагрузка» покажет память за сутки или неделю, лимит тарифа и пик. Текущее потребление видно и на странице «Консоль» в панели.
- Если сервер упал, доктор сервера в консоли сам покажет причину: для памяти это карточка «Серверу не хватило памяти».
- Откройте «Запуск» и проверьте флаги Java:
-Xmxдолжен быть меньше лимита из «Нагрузки». - Измените значение, сохраните и запустите сервер кнопкой «Запустить и проследить», если она есть в карточке доктора. Она запускает сервер и смотрит консоль заново.
- Через сутки откройте график за неделю и сравните с прошлым периодом.
На скриншоте доктор показывает три шага, которые совпадают с этим разделом: убрать тяжёлые моды, проверить -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
Читать далее
Вся рубрика →Почему лагает Minecraft-сервер при 10 игроках и что с этим делать
Типичные причины лагов на сервере на 10 игроков: процессор, память, диск, дальность и фермы. Как понять, что именно тормозит, и какие шаги в панели EGN помогают.
Сколько RAM нужно серверу Minecraft: память тарифа, Java и запас
Как память тарифа делится между Java и системой, почему сервер падает с OutOfMemory и когда пора поднимать тариф. С примерами из панели EGN.
Логи сервера Minecraft: где смотреть и что искать
Где лежит latest.log и папка crash-reports, как читать строки журнала, какие слова искать при падении и лагах и как найти нарушителя по нику и времени.