← Назад к вопросам
К какому классу исключений относится OutOfMemoryException
1.0 Junior🔥 251 комментариев
#ООП#Основы Java
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Классификация OutOfMemoryException в Java
Иерархия исключений
OutOfMemoryException относится к классу Error, а не к Exception. Это важное различие.
Полная иерархия:
Throwable
├── Exception (checked)
│ ├── IOException
│ ├── SQLException
│ └── ...
└── Error (unchecked)
├── OutOfMemoryError
├── StackOverflowError
├── VirtualMachineError
└── ...
Почему OutOfMemoryError, а не Exception
OutOfMemoryError наследуется от Error, а не от Exception. Это указывает на серьёзные проблемы в JVM, которые невозможно восстановить в приложении.
Основные характеристики Error:
- Unchecked — не требуется объявление в throws
- Критичные — обычно приводят к падению приложения
- Не ловятся — практически никогда не должны быть caught
- Системные — генерируются JVM, а не приложением
Различие между Exception и Error
// Exception — это ошибки, которые приложение может обработать
try {
int[] array = new int[Integer.MAX_VALUE]; // OutOfMemoryError
} catch (OutOfMemoryError e) {
// ПЛОХО! Не ловим Error в production коде
}
// Правильное использование — профилактика
try {
// код
} catch (FileNotFoundException e) { // Exception
// Можем обработать
}
Когда выбрасывается OutOfMemoryError
- Heap memory исчерпана — создание новых объектов
- Native memory исчерпана — выделение памяти для native структур
- Metaspace переполнена — загрузка слишком много классов
Правильный подход
1. Мониторинг памяти
MemoryUsage heapUsage = ManagementFactory.getMemoryMXBean()
.getHeapMemoryUsage();
long usedMemory = heapUsage.getUsed();
long maxMemory = heapUsage.getMax();
2. Оптимизация — избегаем утечек памяти
- Правильное управление коллекциями
- Закрытие ресурсов (try-with-resources)
- Профилирование памяти
3. Конфигурация JVM
java -Xms1G -Xmx4G MyApplication
Итого
OutOfMemoryError — это Error, а не Exception. Это unchecked исключение, которое указывает на критическую системную ошибку. В production коде его не следует ловить, вместо этого нужно профилировать приложение, оптимизировать использование памяти и правильно настраивать JVM.