Ошибки OutOfMemoryError и StackOverflowError в Java: что делать

Время чтения: 3 минуты
Поэтому основную оплату в гибридном формате ты вносишь уже после трудоустройства
Важно, чтобы ты получил оффер от компании, в которую действительно хочешь
В чем суть ошибок?
java.lang.OutOfMemoryError (ООМ) возникает, когда JVM не может выделить память в одной из областей памяти JVM или ОС.

java.lang.StackOverflowError (SOF) – когда стек потока переполняется. Обычно причина: слишком глубокий рекурсивный вызов.

Диагностика ошибок

java.lang.OutOfMemoryError
Снимай Heap Dump (-XX:+HeapDumpOnOutOfMemoryError) и анализируй его с помощью VisualVM, Eclipse MAT или аналогичных инструментов. Для получения дампа можно использовать jmap.

Анализируй hprof-дамп, полученный через jmap или автоматически JVM, так можно посмотреть самые «тяжёлые» объекты и утечки. Логи GC (-Xlog:gc*) тоже помогают понять, заполняется ли heap перед ошибкой.
С нуля до первой работы: с ментором, поддержкой на каждом этапе
и с гибким форматом оплаты
Обучение в IT с фокусом на трудоустройство
java.lang.StackOverflowError 
Делай jstack (дамп потоков) и смотри глубину стека текущего
потока, обычно там много повторяющихся вызовов метода. Часто достаточно проанализировать stack trace, а при необходимости использовать jstack для диагностики зависших процессов. 

Устанавливай флаг -Xss<size> для увеличения стека или фиксируй
рекурсию. Но учитывай, что увеличение -Xss помогает только если рекурсия корректна, но глубина вызовов очень велика. При бесконечной рекурсии это лишь отсрочит ошибку.
Примеры ошибок в коде
// Пример java.lang.OutOfMemoryError: наполняем список большими массивами
List<byte[]> list = new ArrayList<>();
try {
while(true) {
list.add(new byte[5_000_000]); // выделяем по 5MB
}
} catch (OutOfMemoryError e) {
System.err.println("OOM пойман: " + e);
}


// Пример java.lang.StackOverflowError: бесконечная рекурсия
public class SOF {
public static void recurse() {
recurse(); // без условия выхода
}
public static void main(String[] args) {
recurse(); // тут упадёт StackOverflowError
}
}
Что делать при ошибках?
java.lang.OutOfMemoryError 
Понять причину: увеличить память (-Xmx) или устранить удержание ненужных объектов: очистить коллекции, удалить слушателей, закрыть ресурсы, избегать хранения лишних ссылок.

Анализ кучи и профилирование обязательны. В Java 8+ причиной может быть переполнение Metaspace. Стоит проверить неподдерживаемый код (бесконечное генерирование строк или классов).

Технически это работает, но в реальном коде ловить OutOfMemoryError обычно не рекомендуется. Почему? После OOM JVM может находиться в непредсказуемом состоянии. OutOfMemoryError относится к классу Error, а не Exception, поэтому обычно не перехватывается для продолжения работы приложения.
Узнай свою рыночную зарплату за 1 минуту!
IT-калькулятор зарплат
java.lang.StackOverflowError (SOF)
Уменьшить глубину рекурсии, переписать рекурсию в итерацию,
увеличить размер стека через -Xss, но это лишь временный «пластырь». Важно найти логическую ошибку.

Ты прочитал материал из методички к нашему курсу «Java-разработчик». Всего в ней собрано более ста вопросов из техинтервью с разборами ответов. Это помогает выпускникам быстро повторить стек и пройти тренировочные собеседования с ментором. После такой подготовки они выходят на реальные интервью с работодателями уверенными в своих знаниях и получают отличные офферы. 

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

Статьи для старта в IT

Истории наших выпускников

Стань тем, кто задаёт тон в ИТ!
Подпишись на нашу рассылку и первым получай статьи по Java, JavaScript, Go и QA. Позволь себе быть экспертом!