Вопрос 23 · Раздел 3

Что такое heap dump?

4. Осторожно с дампом > 64 ГБ 5. JFR для больших Heap 6. PII — маскируйте перед анализом 7. class_histogram → быстрая альтернатива

Версии по языкам: English Russian Ukrainian

🟢 Junior Level

Heap Dump — это “фотография” всей памяти Java в момент времени.

Простая аналогия: Фотография рабочего стола, чтобы потом посмотреть, что на нём лежит.

Что содержит:

  • Все объекты в памяти
  • Все ссылки между ними
  • Статические поля

НЕ содержит: стек-трейсы потоков (это Thread Dump — отдельный механизм).

Зачем нужен:

  • Найти утечку памяти
  • Понять, почему приложение тормозит
  • Анализировать после OutOfMemoryError

🟡 Middle Level

Риски снятия дампа

Stop-The-World!
  → 32 ГБ на HDD → 30-60 секунд
  → 32 ГБ на SSD → 5-15 секунд
  
Диск:
  → Дамп = размер Heap (32 ГБ → 32 ГБ файл)
  → Место может закончиться!

Способы снятия

Способ Когда Файл
Автоматически При OOME -XX:+HeapDumpOnOutOfMemoryError
Вручную Диагностика jcmd <pid> GC.heap_dump dump.hprof
Только живые Анализ утечек jcmd <pid> GC.heap_dump -all=false

Сжатие (Java 11+)

-XX:+HeapDumpGzip  # Сжатие на лету
# → 32 ГБ → 6-10 ГБ файл
# → Экономия места и времени передачи

Конфиденциальность

Дамп содержит ВСЁ:
  → Пароли в char[]
  → Номера карт
  → Персональные данные
  
→ Не передавайте через открытые каналы!
→ Используйте RedactHprof для маскировки

🔴 Senior Level

HeapDumpPath в контейнерах

# В Kubernetes:
-XX:HeapDumpPath=/var/log/dumps/

# /var/log → external volume
# → Дамп не забьёт эфемерное хранилище
# → Можно скачать после падения

Live vs All

-all=true (по умолчанию):
  → Все объекты (живые + мёртвые)
  → Большой файл
  → Быстрее снятие

-all=false (live):
  → Только живые объекты. Перед снятием JVM запускает
    Full GC, чтобы определить достижимость. Без Full GC
    JVM не знает, какие объекты «живые».
    Это добавляет STW-паузу к времени создания дампа!
  → Меньше файл

JFR как альтернатива

Heap > 64 ГБ → дамп практически бесполезен
  → Слишком большой
  → Долго снимать
  → Долго анализировать
  
Решение: JFR OldObjectSample
  → 90% информации о утечках
  → Оверхед < 1%
  → Без STW

OQL запросы

-- Найти большие строки
SELECT x.value.toString() 
FROM java.lang.String x 
WHERE x.value.length > 1000

-- Найти все Map
SELECT * FROM java.util.HashMap

-- Найти объекты конкретного класса
SELECT * FROM com.example.MyClass

Best Practices

  1. HeapDumpOnOutOfMemoryError — обязательно
  2. HeapDumpPath → внешний volume
  3. HeapDumpGzip (Java 11+) — сжатие
  4. Осторожно с дампом > 64 ГБ
  5. JFR для больших Heap
  6. PII — маскируйте перед анализом
  7. class_histogram → быстрая альтернатива

Резюме для Senior

  • Heap Dump = бинарный снимок Heap
  • STW пауза = главный риск
  • Gzip (Java 11+) = экономия места
  • PII = дамп содержит секреты
  • JFR > Heap Dump для > 64 ГБ
  • OQL = запросы к дампу
  • Внешний volume для дампов в контейнерах

🎯 Шпаргалка для интервью

Обязательно знать:

  • Heap Dump — «фотография» всей Heap памяти: все объекты, ссылки, статические поля; НЕ содержит стек-трейсы (это Thread Dump)
  • Дамп = STW: 32 ГБ на HDD → 30-60 секунд, на SSD → 5-15 секунд; в Kubernetes Liveness Probe fail → под убит
  • All vs Live: -all=true (все объекты, быстрее); -all=false (только живые, требует Full GC перед дампом → дополнительная STW)
  • Gzip (Java 11+): -XX:+HeapDumpGzip → 32 ГБ → 6-10 ГБ файл; экономия места и времени передачи
  • PII: дамп содержит пароли, токены, персональные данные; не передавайте через открытые каналы; используйте RedactHprof
  • JFR > Heap Dump для > 64 ГБ: 90% информации об утечках, < 1% overhead, без STW
  • В Kubernetes: -XX:HeapDumpPath=/var/log/dumps/ → external volume; дамп не забьёт эфемерное хранилище

Частые уточняющие вопросы:

  • Почему Live дамп требует Full GC? — Чтобы определить достижимость объектов, JVM должна запустить Full GC; без Full GC JVM не знает, какие объекты «живые»
  • Что содержит Heap Dump, а что нет? — Содержит: объекты, ссылки, static поля. НЕ содержит: стек-трейсы потоков, стек-переменные
  • Почему JFR лучше для больших Heap? — Heap > 64 ГБ → дамп практически бесполезен (слишком большой, долго снимать/анализировать); JFR даёт 90% информации без STW
  • Какие риски передачи дампа? — Содержит пароли в char[], номера карт, сессии; передавайте только через защищённые каналы

Красные флаги (НЕ говорить):

  • «Heap Dump содержит стек-трейсы» — это Thread Dump; Heap Dump только объекты в Heap
  • «Live дамп быстрее» — Live дамп требует Full GC ПЕРЕД дампом → дополнительная STW пауза
  • «Дамп можно спокойно делать в production» — STW пауза; увеличьте timeout probes или используйте JFR

Связанные темы:

  • [[24. Как получить heap dump]]
  • [[21. Что такое memory leak и как его обнаружить]]
  • [[22. Какие инструменты помогают анализировать память]]
  • [[19. Что произойдёт при OutOfMemoryError]]
  • [[16. Что такое stop-the-world]]