Gymterview
middle

Какие инструменты для мониторинга и диагностики 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.