Назад к вопросам
Альфа-Банк
Senior
3
Как снимали heap dump, как анализировали, как автоматизировали снятие?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Heap dump — это снимок состояния кучи JVM в определённый момент времени, который помогает анализировать использование памяти и искать утечки.
Как снимали heap dump:
- Использовали встроенные инструменты JVM, например,
jmap -dump:live,format=b,file=heapdump.hprof <pid>. - В продакшене можно вызвать heap dump через JMX или с помощью
jcmd <pid> GC.heap_dump <file>. - Иногда heap dump создавали при OutOfMemoryError, настроив JVM с параметром
-XX:+HeapDumpOnOutOfMemoryError.
Как анализировали:
- Открывали heap dump в инструментах типа Eclipse MAT (Memory Analyzer Tool) или VisualVM.
- Ищут подозрительные объекты, которые занимают много памяти.
- Анализируют пути удержания объектов (dominator tree), чтобы понять, почему объекты не собираются сборщиком мусора.
- Используют отчёты о подозрительных утечках, например, "Leak Suspects" в MAT.
Как автоматизировали снятие:
- Настраивали JVM на автоматический дамп при ошибках памяти.
- Писали скрипты мониторинга, которые при достижении определённого порога памяти запускали
jcmdдля снятия heap dump. - Интегрировали с системами мониторинга (Prometheus, Grafana), чтобы автоматически реагировать на аномалии и собирать дампы.
Пример команды для снятия heap dump вручную:
jcmd <pid> GC.heap_dump /path/to/heapdump.hprof
Автоматизация на bash (пример):
#!/bin/bash
THRESHOLD=80 # % использования памяти
PID=$(pidof java_app)
USAGE=$(jstat -gc $PID | tail -1 | awk '{print $3+$5}')
if (( $(echo "$USAGE > $THRESHOLD" | bc -l) )); then
jcmd $PID GC.heap_dump /tmp/heapdump_$(date +%s).hprof
fi