JVM Tools Cheatsheet: javap, jimage та інструменти моніторингу

⏱ 4 min read TECH

Усі команди йдуть у складі JDK ($JAVA_HOME/bin). Версії наведені для сучасних JDK (11+), деякі ключі можуть відрізнятись між версіями.


javap — дизасемблер класів

Показує сигнатури, байт-код або структуру скомпільованих .class файлів. Корисно, коли треба зрозуміти, що саме згенерував компілятор (bridge-методи, generics erasure, synthetic-поля тощо).

javap [опції] ім'я.класу
javap [опції] шлях/до/файлу.class
КлючЩо робить
-cПоказати дизасембльований байт-код (JVM instructions)
-p / -privateПоказати всі члени класу, включно з private
-publicТільки public члени (за замовчуванням)
-protectedprotected і вище
-packagepackage-private і вище (default access)
-v / -verboseПовний вивід: constant pool, stack size, args size, exceptions, атрибути
-lНомери рядків і таблиця локальних змінних (потребує компіляції з -g)
-sВнутрішні сигнатури типів (type signatures)
-sysinfoІнформація про системний ресурс класу (шлях, дата, MD5)
-classpath <path>Вказати classpath для пошуку класу
--module-path <path>Вказати шлях до модулів (JPMS)
-m <module>Вказати конкретний модуль

Приклади:

javap -c -p com.example.MyClass          # весь байт-код, включно з private
javap -v com.example.MyClass             # повна інформація + constant pool
javap -l -p target/classes/com/example/MyClass.class

jimage — робота з модульними образами JDK (lib/modules)

З’явився разом із Project Jigsaw (JDK 9+). Дозволяє заглянути всередину модульного runtime-образу (jrt:/), який замінив rt.jar.

jimage <підкоманда> [опції] шлях/до/образу
ПідкомандаЩо робить
listСписок усіх ресурсів (класів) у образі
extractРозпакувати вміст образу у файлову систему
verifyПеревірити цілісність образу
infoМетадані про образ
КлючЩо робить
--dir <path>Куди екстрактити (для extract)
--include <pattern>Фільтр ресурсів за glob-патерном
--verboseДетальний вивід

Приклади:

jimage list $JAVA_HOME/lib/modules | less
jimage list --include "java.base/*" $JAVA_HOME/lib/modules
jimage extract --dir out $JAVA_HOME/lib/modules
jimage verify $JAVA_HOME/lib/modules

Практично корисно: подивитись, чи модуль присутній у runtime, або дістати .class файл системного класу, щоб прогнати його через javap.


Інструменти моніторингу JVM

jps — список Java-процесів (аналог ps для JVM)

jps [опції] [hostid]
КлючЩо робить
-lПовний шлях до main-класу або jar
-mАргументи, передані в main()
-vJVM-опції запуску (flags)
-qТільки PID, без назв
jps -lvm

jstat — статистика JVM у реальному часі (GC, класи, JIT)

jstat -<опція> [-t] [-h<рядків>] <pid> [interval_ms [count]]
ОпціяЩо показує
-gcСтатистика heap по всіх поколіннях (Eden, Survivor, Old, Metaspace)
-gcutilТе саме, але у % заповненості
-gccapacityРозміри поколінь і capacity
-gccause-gcutil + причина останнього GC
-classСтатистика завантаження класів
-compilerСтатистика JIT-компіляції
jstat -gcutil 12345 1000 10     # кожну секунду, 10 разів
jstat -gccause 12345 2000       # кожні 2с, безкінечно

jstack — дампи стеків потоків (thread dump)

Головний інструмент для діагностики зависань, дедлоків, high CPU.

jstack [опції] <pid>
КлючЩо робить
-lДодатково інформація про lock (ownable synchronizers)
-FФорсувати дамп, якщо процес не відповідає
-mПоказати також native (C/C++) стек-фрейми
jstack -l 12345 > threaddump.txt
jstack -l 12345 | grep -A5 "BLOCKED"   # шукати дедлоки

jmap — дампи heap і статистика пам’яті

jmap [опції] <pid>
КлючЩо робить
-heapЗагальна конфігурація і статистика heap
-histo[:live]Гістограма об’єктів у heap (:live — тільки живі, викликає GC)
-dump:live,format=b,file=heap.hprofЗробити повний heap dump (live = тільки reachable об’єкти)
-clstatsСтатистика classloader’ів
jmap -histo:live 12345 | head -30
jmap -dump:live,format=b,file=heap.hprof 12345

На сучасних JDK частину цих команд краще виконувати через jcmd (нижче) — jmap поступово застарілий.


jcmd — універсальний “швейцарський ніж” для діагностики

Замінює багато окремих утиліт одним інтерфейсом.

jcmd <pid|main-class> <команда> [аргументи]
jcmd -l                          # список усіх запущених JVM
КомандаЩо робить
helpСписок усіх доступних команд для конкретного PID
Thread.printThread dump (аналог jstack)
GC.heap_infoІнформація про heap
GC.class_histogramГістограма об’єктів (аналог jmap -histo)
GC.runФорсувати повний GC
GC.heap_dump filename=heap.hprofHeap dump (аналог jmap -dump)
VM.flagsАктивні JVM-опції запуску
VM.system_propertiesSystem properties
VM.uptimeЧас роботи JVM
VM.versionВерсія JVM
jcmd 12345 help
jcmd 12345 Thread.print
jcmd 12345 GC.heap_dump filename=heap.hprof
jcmd 12345 VM.flags

jinfo — перегляд і зміна конфігурації JVM у реальному часі

jinfo [опції] <pid>
КлючЩо робить
-flagsУсі явно задані JVM flags
-syspropsSystem properties
-flag <name>Значення конкретного flag
-flag [+/-]<name>Увімкнути/вимкнути manageable flag (наприклад +PrintGC)
jinfo -flags 12345
jinfo -flag MaxHeapSize 12345

jconsole / jvisualvm — GUI-моніторинг

Не CLI, а графічні інструменти для live-моніторингу heap, threads, MBeans, CPU.

jconsole [pid|host:port]
jvisualvm    # у новіших JDK окремий download (Visual VM), не входить у комплект

jhsdb — post-mortem аналіз (заміна старого jstack/jmap для мертвих процесів або core dump)

jhsdb <режим> --pid <pid>
jhsdb <режим> --core <core-file> --exe <java-binary>
РежимЩо робить
jstackThread dump з живого процесу або core dump
jmapHeap dump / histogram з core dump
clhsdbІнтерактивна командна оболонка для low-level дослідження
hsdbGUI-версія clhsdb
jhsdb jstack --pid 12345
jhsdb jmap --pid 12345 --heap

Швидка шпаргалка “яка проблема → який інструмент”

СимптомІнструмент
Не знаю, які Java-процеси запущеніjps -lvm
JVM зависла / high CPU на потоціjstack -l або jcmd Thread.print
OutOfMemoryError / підозра на memory leakjmap -histo:live, jcmd GC.heap_dump
Часті GC-паузиjstat -gcutil
Треба зрозуміти байт-код методуjavap -c -p
Клас не знайдено в модулі / шукаю системний класjimage list
Треба подивитись/змінити runtime-flagjinfo, jcmd VM.flags
Аналіз core dump після крахуjhsdb

Comments

Please ensure Giscus is configured with your correct Repository ID and Category ID at giscus.app to enable comments.

© 2025 CodeByMe.de | Engineering