[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-jvm-kakie-instrumenty-dlya-monitoringa-i-diagnostiki-jvm-vy-znaete":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},1219,"kakie-instrumenty-dlya-monitoringa-i-diagnostiki-jvm-vy-znaete",38,"jvm","JVM","⚙️","Какие инструменты для мониторинга и диагностики JVM вы знаете","Инструменты диагностики JVM — это набор утилит командной строки и графических приложений из JDK для мониторинга, профилирования и анализа Java-приложений. Основной рекомендуемый инструмент — `jcmd`, который объединяет функциональность большинства остальных утилит.\n\n### Инструменты командной строки\n\n| Инструмент | Назначение | Пример |\n|---|---|---|\n| `jps` | Список Java-процессов | `jps -l` |\n| `jstack` | Дамп потоков (thread dump) | `jstack \u003Cpid>` |\n| `jmap` | Информация о heap, heap dump | `jmap -dump:format=b,file=dump.hprof \u003Cpid>` |\n| `jstat` | GC-статистика в реальном времени | `jstat -gcutil \u003Cpid> 1000` |\n| `jcmd` | Универсальный инструмент (замена вышеперечисленных) | `jcmd \u003Cpid> help` |\n\n\u003Cdetails>\n\u003Csummary>Примеры использования jcmd\u003C\u002Fsummary>\n\n```bash\n# Thread dump\njcmd \u003Cpid> Thread.print\n\n# Heap dump\njcmd \u003Cpid> GC.heap_dump \u002Ftmp\u002Fheapdump.hprof\n\n# Гистограмма объектов\njcmd \u003Cpid> GC.class_histogram\n\n# Информация о VM\njcmd \u003Cpid> VM.info\n\n# Флаги JVM\njcmd \u003Cpid> VM.flags\n\n# Native Memory Tracking (если включено -XX:NativeMemoryTracking=summary)\njcmd \u003Cpid> VM.native_memory summary\n\n# Запуск\u002Fостановка JFR\njcmd \u003Cpid> JFR.start duration=60s filename=recording.jfr\njcmd \u003Cpid> JFR.stop name=1\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>Примеры использования jstat\u003C\u002Fsummary>\n\n```bash\n# GC-статистика каждую секунду\njstat -gcutil \u003Cpid> 1000\n# Вывод:\n#   S0     S1     E      O      M     CCS    YGC   YGCT   FGC  FGCT   CGC  CGCT   GCT\n#   0.00  45.12  67.89  34.56  95.23  92.11   125  1.234    3  0.567    8  0.089  1.890\n\n# S0\u002FS1 — Survivor, E — Eden, O — Old, M — Metaspace\n# YGC\u002FFGC — количество Young\u002FFull GC, GCT — общее время GC\n\n# Размеры поколений\njstat -gccapacity \u003Cpid> 1000\n```\n\n\u003C\u002Fdetails>\n\n### Графические инструменты\n\njconsole — встроенный инструмент для подключения к JVM через JMX. Показывает использование памяти, потоки, CPU-нагрузку, MBeans.\n\nVisualVM — более продвинутый инструмент (отдельный проект: visualvm.github.io). Предоставляет профилирование CPU и памяти, анализ heap dump, мониторинг GC, визуализацию потоков и поддержку плагинов.\n\n### Java Flight Recorder (JFR)\n\nJFR — это low-overhead система записи событий, встроенная в JVM. С Java 11 (JEP 328) стала бесплатной и open source. Записывает GC-события, аллокации объектов, I\u002FO-операции, блокировки, JIT-компиляцию, исключения и сотни других событий.\n\n```bash\n# Запуск JFR при старте приложения\njava -XX:StartFlightRecording=duration=120s,filename=app.jfr -jar app.jar\n\n# Запуск JFR для работающего процесса\njcmd \u003Cpid> JFR.start duration=120s filename=app.jfr\n```\n\nДля анализа записей используется JDK Mission Control (JMC) или async-profiler.\n\n### async-profiler\n\nПопулярный open-source профилировщик с overhead \u003C 2%. Поддерживает CPU profiling, allocation profiling, lock profiling и генерирует flame graphs.\n\n```bash\n# CPU-профилирование, результат в flame graph\n.\u002Fasprof -d 30 -f flamegraph.html \u003Cpid>\n\n# Профилирование аллокаций\n.\u002Fasprof -d 30 -e alloc -f alloc-flamegraph.html \u003Cpid>\n```\n\n### Практические сценарии\n\n| Проблема | Инструмент | Команда |\n|---|---|---|\n| Приложение зависло | `jstack` | `jstack \u003Cpid>` — ищем deadlock |\n| OutOfMemoryError | `jmap` | `jmap -dump:live,format=b,file=dump.hprof \u003Cpid>` |\n| Высокий CPU | async-profiler | `.\u002Fasprof -d 30 -f cpu.html \u003Cpid>` |\n| Утечка памяти | JFR + JMC | Анализ аллокаций и GC-событий |\n| Медленный GC | `jstat` + GC-логи | `jstat -gcutil \u003Cpid> 1000` |\n\n### Частые ошибки\n\n- Использование `jmap -dump` на production без предупреждения — heap dump может вызвать длинную паузу\n- Забыли включить `-XX:+HeapDumpOnOutOfMemoryError` до возникновения проблемы\n- Включение JMX без аутентификации на production — уязвимость безопасности\n- Анализ heap dump инструментом с недостаточной памятью — используйте Eclipse MAT с большим heap\n\n> **На собеседовании:** назовите `jcmd` как универсальный инструмент, JFR как основной для production-мониторинга (low-overhead), async-profiler для flame graphs. Покажите, что знаете, какой инструмент для какой проблемы: зависло — jstack, OOM — heap dump, высокий CPU — profiler. Обязательно упомяните `-XX:+HeapDumpOnOutOfMemoryError` как must-have для production.","","middle",[7,15,16,17],"performance","monitoring","observability",[],null,{"title":21,"description":22,"ogTitle":23,"ogDescription":24,"keywords":25,"schemaAnswer":37,"featuredSnippetReady":38},"Какие инструменты для мониторинга и диагностики JVM вы знаете — Gymterview","Инструменты JVM: jcmd, jstack, jmap, jstat, JFR, async-profiler, VisualVM. Практические сценарии: deadlock, OOM, высокий CPU, утечка памяти, медленный GC.","Инструменты мониторинга и диагностики JVM — Gymterview","Полный обзор: jcmd, JFR, async-profiler. Какой инструмент для какой проблемы: deadlock, OOM, CPU, GC.",[26,27,28,29,30,31,32,33,34,35,8,36],"jcmd","jstack","jmap","jstat","JFR","Java Flight Recorder","async-profiler","VisualVM","heap dump","thread dump","собеседование","CLI: jcmd (универсальная замена jmap\u002Fjstack\u002Fjstat), jps (список процессов), jstack (thread dump), jmap (heap dump), jstat (GC-статистика). GUI: jconsole (JMX), VisualVM (профилирование). JFR (Java Flight Recorder) — low-overhead запись событий для production. async-profiler — flame graphs для CPU\u002Fallocation\u002Flock профилирования. Обязательно: -XX:+HeapDumpOnOutOfMemoryError.",true]