Какие инструменты для мониторинга и диагностики JVM вы знаете
Инструменты диагностики JVM — это набор утилит командной строки и графических приложений из JDK для мониторинга, профилирования и анализа Java-приложений. Основной рекомендуемый инструмент — jcmd, который объединяет функциональность большинства остальных утилит.
Инструменты командной строки
| Инструмент | Назначение | Пример |
|---|---|---|
jps |
Список Java-процессов | jps -l |
jstack |
Дамп потоков (thread dump) | jstack <pid> |
jmap |
Информация о heap, heap dump | jmap -dump:format=b,file=dump.hprof <pid> |
jstat |
GC-статистика в реальном времени | jstat -gcutil <pid> 1000 |
jcmd |
Универсальный инструмент (замена вышеперечисленных) | jcmd <pid> help |
Примеры использования jcmd
# Thread dump
jcmd <pid> Thread.print
# Heap dump
jcmd <pid> GC.heap_dump /tmp/heapdump.hprof
# Гистограмма объектов
jcmd <pid> GC.class_histogram
# Информация о VM
jcmd <pid> VM.info
# Флаги JVM
jcmd <pid> VM.flags
# Native Memory Tracking (если включено -XX:NativeMemoryTracking=summary)
jcmd <pid> VM.native_memory summary
# Запуск/остановка JFR
jcmd <pid> JFR.start duration=60s filename=recording.jfr
jcmd <pid> JFR.stop name=1
Примеры использования jstat
# GC-статистика каждую секунду
jstat -gcutil <pid> 1000
# Вывод:
# S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT
# 0.00 45.12 67.89 34.56 95.23 92.11 125 1.234 3 0.567 8 0.089 1.890
# S0/S1 — Survivor, E — Eden, O — Old, M — Metaspace
# YGC/FGC — количество Young/Full GC, GCT — общее время GC
# Размеры поколений
jstat -gccapacity <pid> 1000
Графические инструменты
jconsole — встроенный инструмент для подключения к JVM через JMX. Показывает использование памяти, потоки, CPU-нагрузку, MBeans.
VisualVM — более продвинутый инструмент (отдельный проект: visualvm.github.io). Предоставляет профилирование CPU и памяти, анализ heap dump, мониторинг GC, визуализацию потоков и поддержку плагинов.
Java Flight Recorder (JFR)
JFR — это low-overhead система записи событий, встроенная в JVM. С Java 11 (JEP 328) стала бесплатной и open source. Записывает GC-события, аллокации объектов, I/O-операции, блокировки, JIT-компиляцию, исключения и сотни других событий.
Пример
# Запуск JFR при старте приложения
java -XX:StartFlightRecording=duration=120s,filename=app.jfr -jar app.jar
# Запуск JFR для работающего процесса
jcmd <pid> JFR.start duration=120s filename=app.jfr
Для анализа записей используется JDK Mission Control (JMC) или async-profiler.
async-profiler
Популярный open-source профилировщик с overhead < 2%. Поддерживает CPU profiling, allocation profiling, lock profiling и генерирует flame graphs.
Пример
# CPU-профилирование, результат в flame graph
./asprof -d 30 -f flamegraph.html <pid>
# Профилирование аллокаций
./asprof -d 30 -e alloc -f alloc-flamegraph.html <pid>
Практические сценарии
| Проблема | Инструмент | Команда |
|---|---|---|
| Приложение зависло | jstack |
jstack <pid> — ищем deadlock |
| OutOfMemoryError | jmap |
jmap -dump:live,format=b,file=dump.hprof <pid> |
| Высокий CPU | async-profiler | ./asprof -d 30 -f cpu.html <pid> |
| Утечка памяти | JFR + JMC | Анализ аллокаций и GC-событий |
| Медленный GC | jstat + GC-логи |
jstat -gcutil <pid> 1000 |
Частые ошибки
- Использование
jmap -dumpна production без предупреждения — heap dump может вызвать длинную паузу - Забыли включить
-XX:+HeapDumpOnOutOfMemoryErrorдо возникновения проблемы - Включение JMX без аутентификации на production — уязвимость безопасности
- Анализ heap dump инструментом с недостаточной памятью — используйте Eclipse MAT с большим heap
На собеседовании: назовите
jcmdкак универсальный инструмент, JFR как основной для production-мониторинга (low-overhead), async-profiler для flame graphs. Покажите, что знаете, какой инструмент для какой проблемы: зависло — jstack, OOM — heap dump, высокий CPU — profiler. Обязательно упомяните-XX:+HeapDumpOnOutOfMemoryErrorкак must-have для production.