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

Какие инструменты помогают анализировать память?

4. Осторожно с дампом → STW пауза 5. NMT для Native Memory 6. gceasy.io для анализа GC логов 7. Arthas для сложных окружений

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

🟢 Junior Level

Инструменты для анализа памяти:

Инструмент Для чего Когда
Eclipse MAT Анализ дампов После OOME
VisualVM Мониторинг Разработка
jcmd Быстрая проверка Production
JProfiler Профилирование Разработка

Самый важный: Eclipse MAT (бесплатный)

  • Открывает дамп хипа
  • Показывает, какие объекты занимают больше всего памяти
  • Находит утечки

🟡 Middle Level

jcmd (утилита командной строки)

jcmd <pid> GC.class_histogram   # Список классов
jcmd <pid> GC.heap_dump dump.hprof  # Снять дамп
jcmd <pid> VM.native_memory summary  # Native Memory

Eclipse MAT

Ключевые функции:
  → Dominator Tree (кто держит больше всего памяти)
  → Path to GC Roots (цепочка ссылок до корня)
  → OQL (запросы к дампу)
  → Leak Suspects Report (автоматический анализ)

JFR и JMC

Java Flight Recorder (встроен в JVM):
  → Оверхед < 1%
  → Можно держать включённым в production
  
JDK Mission Control (GUI):
  → Визуализация JFR записей
  → OldObjectSample → утечки без дампа

Коммерческие инструменты

Инструмент Плюсы Минусы
JProfiler Live profiling Платный
YourKit Allocation tracking Платный
gceasy.io Анализ GC логов Облачный

🔴 Senior Level

Опасность снятия дампа

Heap Dump = Stop-The-World!
  → 32 ГБ Heap на HDD → 30-60 секунд пауза
  → 32 ГБ Heap на SSD → 5-15 секунд
  
В Kubernetes:
  → Liveness Probe timeout → под убит!
  
Решение для больших Heap:
  → JFR OldObjectSample (без STW)
  → class_histogram (пауза < 1 сек)

OQL примеры

-- Найти все HashMap с > 1000 элементов
SELECT map FROM java.util.HashMap map
WHERE map.size > 1000

-- Найти дубликаты строк
SELECT toString(s.value) as val, count(*) as cnt
FROM java.lang.String s 
GROUP BY toString(s.value) 
HAVING count(*) > 100

-- Найти утечки ThreadLocal
SELECT tl, tl.referents.@length as size
FROM java.lang.ThreadLocal tl
WHERE tl.referents.@length > 100

Arthas (Alibaba)

# Интерактивная диагностика на сервере
java -jar arthas-boot.jar

[arthas]$ dashboard     # Обзор Heap/Native/Metaspace
[arthas]$ heapdump      # Снять дамп
[arthas]$ vmtool        # Инспекция объектов
[arthas]$ memory        # Детали памяти

NMT (Native Memory Tracking)

-XX:NativeMemoryTracking=detail

jcmd <pid> VM.native_memory detail

# Покажет:
# Java Heap, Class, Thread, Code, GC
# Compiler, Internal, Symbol, Arena Chunk
# → Найти утечки вне Heap

Best Practices

  1. jcmd > jmap (современный стандарт)
  2. JFR для production мониторинга
  3. MAT для анализа дампов
  4. Осторожно с дампом → STW пауза
  5. NMT для Native Memory
  6. gceasy.io для анализа GC логов
  7. Arthas для сложных окружений

Резюме для Senior

  • jcmd = современный стандарт CLI
  • MAT = Dominator Tree + Path to GC Roots
  • JFR = < 1% overhead, production-safe
  • NMT = Native Memory Tracking
  • Дамп = STW (все потоки останавливаются). JVM должна заморозить граф объектов в консистентном состоянии: никаких аллокаций, deallocations или изменений ссылок во время дампа. На больших Heap дамп может занять 10-60 секунд.
  • OQL = SQL для дампов
  • Arthas = интерактивная диагностика

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

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

  • Eclipse MAT — анализ дампов: Dominator Tree, Path to GC Roots, OQL, Leak Suspects Report (бесплатный)
  • jcmd — современный стандарт CLI: GC.class_histogram, GC.heap_dump, VM.native_memory
  • JFR + JMC — production мониторинг, < 1% overhead; OldObjectSample → утечки без дампа
  • NMT (-XX:NativeMemoryTracking=detail): Native Memory Tracking — показывает Java Heap, Class, Thread, Code, GC, Internal
  • Дамп = STW: на 32 ГБ HDD → 30-60 секунд; в Kubernetes Liveness Probe timeout → под убит
  • OQL — SQL-подобные запросы к дампу: найти большие HashMap, дубликаты строк, утечки ThreadLocal
  • Arthas (Alibaba): интерактивная диагностика на сервере — dashboard, heapdump, vmtool, memory

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

  • Почему jcmd лучше jmap? — jmap deprecated; jcmd — современный стандарт, использует JVM Attach API, больше команд
  • Когда JFR лучше дампа? — Heap > 64 ГБ: дамп слишком большой, долго снимать/анализировать; JFR < 1% overhead, без STW
  • Что показывает NMT, чего не видно в Heap Dump? — Native Memory: Code Cache, Thread Stacks, GC structures, Internal — всё вне Heap
  • Почему дамп требует STW? — JVM должна заморозить граф в консистентном состоянии: никаких аллокаций/deallocations во время дампа

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

  • «Снимаю дамп в production без предупреждения» — STW 30-60 секунд; в Kubernetes под будет убит
  • «jmap — лучший инструмент» — jmap deprecated; используйте jcmd
  • «Heap Dump показывает всю память JVM» — Heap Dump только On-Heap; Native Memory требует NMT

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

  • [[21. Что такое memory leak и как его обнаружить]]
  • [[23. Что такое heap dump]]
  • [[24. Как получить heap dump]]
  • [[19. Что произойдёт при OutOfMemoryError]]
  • [[18. Что такое параметры -Xms и -Xmx]]