Що таке 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% інформації про витоки
→ Overhead < 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. Що таке витік пам’яті і як його виявити]]
- [[22. Які інструменти допомагають аналізувати пам’ять]]
- [[19. Що станеться при OutOfMemoryError]]
- [[16. Що таке stop-the-world]]