Sobes.tech
Назад к вопросам
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