JConsole: кардиограмма вашей программы
Сегодня мы расскажем вам о JConsole, средстве диагностики работающего приложения Java.
JConsole способна подключаться к работающей JVM начиная с версии 1.5.0, локально и удаленно, правда, с некоторыми ограничениями. Можно подключиться одновременно к нескольким процессам, данные о каждом процессе будут отображаться в своем окне, можно даже создать несколько окон для одного процесса. Вы можете временно отключиться от процесса, нажав зеленую иконку вверху окна, а затем подключиться снова. Линия на графиках будет прерываться в периодах, когда jconsole была отключена.
Что же показывает JConsole? Рассмотрим каждую закладку.
Закладка Overview

Heap Memory Usage:
- Used: сколько памяти используется для всех поколений
- Comitted: сколько всего системной памяти отведено для JVM
- Max: максимальное количество системной памяти, которую JVM может попросить у системы
Threads:
- Live: текущее кол-во нитей, кроме Daemon Threads
- Peak: пиковое значение за период
- Total: полное количество нитей
Classes:
- Loaded: Количество классов, загруженных в данный момент
- Unloaded: кол-во классов, которые были выгружены GC
- Total: общее кол-во классов, которые были загружены за период (считая выгруженные)
CPU Usage: процент процессорного времени.
Кстати, вы можете сменить период времени, за который отображаются данные, щелкнув правой кнопкой на графике.
Memory
На этой закладке ожно увидеть дополнительную информацию о пулах памяти:

- Heap Memory Usage: суммарное использование памяти областями Eden, Survivor Spaces и Tenured (AKA Old) Generation.
- Non-Heap Memory Usage: суммарная память, необходимая для:
- скомпилированных методов (code cache),
- Permanent Generation данного процесса,
- разделяемой между процессами Permanent Generation:
- только для чтения (shared-ro) и
- для чтения и записи (shared-rw).
Также вы можете увидеть время, затраченное на сборку мусора внизу, в поле GC time:
| GC time: | 6,960 seconds on Copy (2 254 collections) |
|---|---|
11,616 seconds on MarkSweepCompact (77 collections) |
Первое значение, это время на сборку мусора в Young Generation, название использующегося сборщика мусора (Copy = Copying GC) и количество сборок. Вторая строка, соответственно, показывает данные для Tenured или Old Generation.
Данные о работе сборщиков мусора в текстовой вы можете получить, запустив программу с опцией -verbose:gc.
Нажав на кнопку Perform GC, вы инициируете сборку мусора в обоих поколениях.
Закладка Threads
…покажет вам текущее количество нитей (live threads), их пиковое значение (peak). Кроме того вы можете посмотреть список нитей и информацию о каждой.

Вы можете отфильтровать нити в списке, введя любую часть названия в поле Filter.
Выбрав нить в списке, вы получаете следующую информацию о нити:
- Название (из java.lang.Thread.getName(), или сформированное JVM)
- Состояние:
- RUNNABLE,
- WAITING on <object>. Нить вызвала <object>.wait()
- TIMED_WAITING on … то же самое, но wait() был со временем ожидания
- BLOCKED—нить блокировалась, пытаясь захватить объект синхронизации
Возможно, вам удастся также заметить следующие состояния:
- TERMINATED—нить завершилась или была завершена
- NEW—нить создана, но еще не начала выполняться
- Total blocked—суммарное количество блокировок
- Total waited—суммарное кол-во ожиданий
- Stack trace—стек Java. Фреймы кода native и JVM не отображаются. Зато вы можете увидеть активные блокировки, созданные соответствующим методом.
Похожую информацию вы можете получить, нажав Ctrl+\ или Ctrl+Break под Windows, или воспользовавшись утилитой jstack)
Кнопка "Detect Deadlock" обнаруживает все имеющиеся тупики (deadlocks) в программе. Они определяется компонентом ThreadMXBean, находящемся в отслеживаемом процессе. В Mustang определяются и тупики, в которых участвуют классы из java.util.concurrent (JSR 166).
Classes

Здесь вы увидите количество классов, загруженных в данный момент (Loaded), общее кол-во классов, которые были загружены за период, считая выгруженные (Total Loaded) и кол-во классов, которые были выгружены GC (Total classes unloaded).
Если вы включите галочку Verbose Output, консоль приложения начнет выводить имена загружаемых и выгружаемых классов. Это эквивалентно запуску процесса с опцией -verbose:class
Закладка VM Summary

В этой закладке есть много интересных данных о виртуальной машине, которую вы сейчас отслеживаете. Они довольно очевидны. Упомянем лишь несколько:
- Pending Finalization: кол-во объектов в Finalization Queue
- Total compile time: время, затраченное JIT на компиляцию
- Committed memory: память, запрошенная у системы под кучу
- Committed virtual memory: сколько памяти отведено системой под JVM
- Library path: путь, откуда будут загружаться native-библиотеки (java.lang.System.load()) и JVMTI-агенты. Под UNIX это LD_LIBRARY_PATH, на Windows—PATH.
- Class path: CLASS_PATH
- Boot class path: путь, откуда загружаются базовые классы. Устанавливается опцией -Xbootclasspath.
Закладка MBeans
Дело в том, что JConsole взаимодействует с отслеживаемым приложением по протоколу JMX, который, в свою очередь, работает через RMI. Когда вы подсоединяетесь к виртуальной машине, в ней запускается JMX-агент, использующий свой собственный реестр RMI (RMI registry). Этот агент создает управляющие объекты и объекты-датчики. Согласно спецификации JMX, они называются MBeans ("Management Beans").
Эти объекты уже имеются в JVM версий 6.0 и 1.5.0. Кроме того, приложение Java может добавлять собственные MBeans.
MBeans и протокол JMX позволяют:
- Читать и устанавливать значения атрибутов
- Вызывать операции (методы) MBean, находящегося в отслеживаемой программе
- Подписываться и получать нотификации от программы
Т.к. JMX-приложение может не знать всех типов "по другую сторону" соединения, им должны поддерживаться примитивные типы, java.lang.String, и некоторые другие. Для сложных объектов необходимо использовать типы javax.management.openmbean.CompositeData и TabularData.
Закладка MBeans предоставляет вам графический интерфейс к MBeans JVM и программы:

Вот несколько примеров уже существующих операций MBeans:
- com.sun.management => Operations => dumpHeap записывает кучу в файл. Затем,
вы можете посмотреть этот файл с помощью
jhat:
% jhat dump
Теперь, на localhost:7000, вы можете посмотреть кучу браузером.
Reading from dump...
Dump file created Mon May 29 09:34:48 MSD 2006
Snapshot read, resolving...
Resolving 82882 objects...
Chasing references, expect 16 dots................
Eliminating duplicate references................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready. - java.lang.management => Threading => Operations =>
findDeadlockedThreads() находит тупики с участием стандартных мониторов и объектов
из java.lang.concurrent.
- java.util.logging => Logging дает вам доступ к мощному интерфейсу файлов событий.
Подключение к приложениям
JConsole может подключаться:
- К локальному процессу, используя собственный интерфейс с JVM:
% jps
28996 JConsole
741 Jps
% jconsole 28996 - К удаленному процессу:
% jconsole host.sun.com:2345
Но для того, чтобы подсоединиться вам нужно будет запустить приложение со специальными опциями:
% java -Dcom.sun.management.jmxremote.port=7000 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar Application.jar \ - Также вы можете использовать
особый URL в стиле протокола
Service Location Protocol (SLP):
service:jmx:rmi:///jndi/rmi://host:port/jmxrmi
Формат этого URL определен в RFC 2609.
Если вы не можете подключиться к приложению, почитайте FAQ здесь или здесь.
Ссылки
- Using JConsole to Monitor Applications
- Блог Mandy Chung: Mustang JConsole, JConsole will be supported in Mustang.
- jconsole man page
- Frequently Asked Questions JConsole and Remote Management
- Monitoring and Management Using JMX
- JDK Tools and Utilities
- JMX: Java Management Extensions
- JTop: утилита top для Java-потоков, $JDK_DIR/demo/management/JTop
- jconsole scripting shell, $JDK_DIR/demo/scripting/jconsole-plugin
К. Ш.
опубликовал vmrobot ( май 29 2006, 08:16:53 PM MSD ) Permalink Комментарии [5]


опубликовал serb Июнь 08, 2006 at 08:57 PM MSD #
опубликовал Alex Сентябрь 09, 2006 at 09:38 AM MSD #
опубликовал Kirill Shirokov Январь 23, 2007 at 05:30 AM MSK #
опубликовал Dmitriy Апрель 06, 2007 at 04:59 PM MSD #
опубликовал Kirill Shirokov Апрель 19, 2007 at 08:05 PM MSD #