Утечка памяти в проде
Вопрос
Сервис на Java через несколько дней падает с OutOfMemoryError. Как будете искать причину?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Уточнить, какая память: heap, Metaspace, direct, native
Метрики кучи после GC: растёт ли нижняя граница
Heap dump при OOM и разбор в MAT: dominator tree, пути до GC roots
Типичные причины: кеши без лимита, ThreadLocal, статические коллекции, слушатели
JFR и профиль аллокаций
Временная мера vs исправление, проверка нагрузочным тестом
Что могут спросить следом
- Чем heap dump опасен на проде?
- Как отличить утечку от просто маленькой кучи?
- Что делать, если растёт RSS процесса, а куча нет?
Разбор
Сначала смотрю текст ошибки: Java heap space, Metaspace, Direct buffer memory или нехватка нативных потоков, это разные истории. Для кучи смотрю график занятой памяти после сборок: если нижняя граница растёт день за днём, это утечка, если куча просто маленькая, она упирается сразу под нагрузкой. Включаю -XX:+HeapDumpOnOutOfMemoryError или снимаю дамп через jcmd GC.heap_dump, помня, что это пауза и большой файл с персональными данными. Дамп открываю в Eclipse MAT, смотрю dominator tree и путь от подозрительных объектов до GC roots. Частые виновники: кеш в статической мапе без ограничения, ThreadLocal в пуле без remove, накопление слушателей, сессии. Для живого профиля аллокаций использую JFR. Если растёт RSS, а куча нет, смотрю Native Memory Tracking и direct-буферы. После исправления подтверждаю нагрузочным тестом.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «JVM: память, GC, загрузка классов»
- Делегирование загрузчиков
- JVM в контейнере
- Сборщик по умолчанию
- Escape analysis
- Этапы загрузки класса
- GC roots
- Области памяти JVM
- Виды ссылок