В составе JDK, помимо всем известных javac, java, есть ещё несколько полезных утилит:
Имя утилиты Размер (байт)
jconsole.exe
16,776
jinfo.exe
16,264
jmap.exe
16,264
jstack.exe
16,264
javap.exe
15,752
jhat.exe
15,752
jps.exe
15,752
jstat.exe
15,752
Я не случайно привел размер каждой утилиты, так как он практически у всех идентичный (~16-17 Кб). По факту, каждая из утилит реализована на Java, а в момент сборки в качестве шаблона используется простейшая утилита реализованная на языке C, которая ищет JRE, затем парсит аргументы, создает JVM, ищет Java-класс утилиты и вызывает соответствующий метод main. Исходной код можно найти
здесь (
${JDK_SOURCE}/jdk/src/share/classes/sun/ или
${JDK_SOURCE}/langtools/src/share/classes/com/sun/tools/).
Любую из утилит можно использовать в своем приложении. Для этого необходимо в
classpath добавить библиотеку
tools.jar (
${JDK_DIR}/lib/tools.jar).
Рассмотрим самые наиболее популярные из них.
jps
(sun.tools.jps.Jps)
Утилита показывающая список JVM (в формате < ID процесса > < Main класс >) запущенных локально или удаленно (для этого необходимо в параметрах хост удаленной системы).
jconsole
(sun.tools.jconsole.JConsole)
Графическая утилита для мониторинга JVM запущенной на локальной или удаленной системе. JConsole использует расширенные возможности JVM и предоставляет информацию касательно производительности, потребляемой памяти, потоков приложения, загруженных классов. Запустить утилиту можно из командной строки введя команду jconsole (появится диалоговое окно выбора JVM для мониторинга), также в качестве параметров можно указать ID процесса (если JVM запущена локально) или имя хоста и порт (если JVM запущена удаленно).
jinfo
(
sun.tools.jinfo.JInfo)
Утилита позволяющая узнать конфигурацию запущенной JVM (для этого в параметрах нужно указать ID процесса): версию JVM, системные параметры, флаги.
jmap
(
sun.tools.jmap.JMap)
Утилита показывающая список объектов разделяемой памяти (
shared object memory), либо объектов находящихся в
heap'е. Для запуска утилиты необходимо указать ID процесса. В зависимости от параметров возможно получение следующей информации:
- Если нет дополнительных аргументов, то выводится список объектов разделяемой памяти. Для каждого объекта указывается стартовый адрес, размер маппинга и полный путь до файла данного объекта.
- -dump:format=b,file=< путь к файлу для дампа > - создается дамп heap'a в бинарном формате hprof. Для того чтобы просмотреть объекты находящиеся в дампе можно воспользоваться стандартной утилитой jhat (будет рассмотрена далее), либо использовать более удобное средство - Eclipse Memory Analyzer.
- -finalizerinfo - выводит список объектов ожидающих финализацию (finalization).
- -histo - выводит гистограмму объектов находящихся в heap'e. Для каждого класса выводится информация о количестве объектов, размере используемой памяти.
- -permstat - выводит расширенную статистику по загрузчикам классов (class loader). Для каждого загрузчика классов выводится его имя, адрес, родительский загрузчик классов (parent class loader), количество и размер загруженных классов.
jstack
(
sun.tools.jstack.JStack)
Утилита печатающая все стэктрэйсы (
stacktrace) JVM запущенной локально (необходимо указать ID процесса), либо удаленно (
< ID процесса >@< IP адрес системы на которой запущена JVM >). Если утилита запущена с параметром
-m (mixed mode), то также выводится стэктрэйс нативных методов.
javap
(
com.sun.tools.javap.Main)
Утилита позволяющая декомпилировать
class-файл. В качестве параметра необходимо указать путь к файлу класса. В зависимости от параметров возможно получение следующей информации:
- Если нет дополнительных параметров, то выводится информация о пакете класса (package), родительский класс, список методов и их сигнатуры.
- -c - В дополнении к базовой информации о классе, выводится список байткодов.
- -verbose - Выводит информацию о размере стека, количестве локальных переменных и аргументов.
Из всех параметров самый важный это verbose - с помощью него можно получить практически всю информацию о классе.
jhat
(
com.sun.tools.hat.Main)
Утилита позволяющая анализировать
heap дампы через веб интерфейс и
DSL OQL (
Object Query Language) (SQL-подобный язык запросов) . Дамп для анализа можно получить одним из следующих способов:
- Использовать утилиту jmap (была описана ранее);
- С помощью утилиты jconsole (была описана ранее) можно получить дамп используя MBean HotSpotDiagnosticMXBean;
- Дамп будет сгенерирован в случае возникнования OutOfMemory и при этому у JVM была указана опция -XX:+HeapDumpOnOutOfMemoryError;
- Использовать утилиту hprof.
Помимо самого дамп файла, в качестве параметров можно указать порт для веб интерфейса (по умолчанию 7000).
jstat
(
sun.tools.jstat.Jstat)
Такие дела,
Иван.