Ответ
JVM выбрасывает java.lang.OutOfMemoryError с сообщением "Java heap space". Это критическая ошибка, означающая, что приложение исчерпало всю выделенную память под объекты, и сборщик мусора (GC) не может освободить достаточное её количество.
Пример, приводящий к ошибке:
List<byte[]> leak = new ArrayList<>();
while (true) {
leak.add(new byte[10_000_000]); // Постоянное выделение памяти
}
Последствия:
- Поток, в котором произошла ошибка, завершается.
- Если ошибка не обработана и возникает в критическом потоке (например, main), приложение аварийно останавливается.
- Обработать
OutOfMemoryErrorможно, но это сложно и обычно не рекомендуется.
Как избежать и диагностировать:
- Увеличить кучу: Задать больший лимит через JVM-флаги
-Xmx4g(максимум 4 ГБ). - Найти утечку: Использовать профилировщики (VisualVM, YourKit, JProfiler) для анализа heap dump.
- Практики кодирования:
- Корректно закрывать ресурсы (использовать try-with-resources).
- Избегать долгоживущих ссылок на временные объекты в коллекциях.
- Для кэшей использовать
WeakReferenceили специализированные библиотеки (Guava, Caffeine).