08 October 2013

Утилиты в составе JDK / Standard JDK utilities

В составе 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)


Такие дела,
Иван.