Что такое heap dump?
4. Осторожно с дампом > 64 ГБ 5. JFR для больших Heap 6. PII — маскируйте перед анализом 7. class_histogram → быстрая альтернатива
🟢 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
- HeapDumpOnOutOfMemoryError — обязательно
- HeapDumpPath → внешний volume
- HeapDumpGzip (Java 11+) — сжатие
- Осторожно с дампом > 64 ГБ
- JFR для больших Heap
- PII — маскируйте перед анализом
- 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]]