Какие инструменты помогают анализировать память?
4. Осторожно с дампом → STW пауза 5. NMT для Native Memory 6. gceasy.io для анализа GC логов 7. Arthas для сложных окружений
🟢 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
- jcmd > jmap (современный стандарт)
- JFR для production мониторинга
- MAT для анализа дампов
- Осторожно с дампом → STW пауза
- NMT для Native Memory
- gceasy.io для анализа GC логов
- 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]]