Питання 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% інформації про витоки
  → 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

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