Out-of-the-Box
Seit Java SE 5 gibt es Out-of-the-Box umfangreiche Möglichkeiten der Überwachung von Java-Applikationen. Diese gliedern sich in vier Kategorien:
- Instrumentation for the Java Virtual Machine (Java VM)
- Monitoring and Management application programming interfaces (API)
- Monitoring and Management tools
- The Java Management Extensions (JMX) technology
Monitoring and Management tools
Neben den Kommando-Zeilen-Tools jps, jstat und jstatd, die schon einige Zeit zur Verfügung stehen, aber weiterhin im Status experimental sind, ist JConsole ein neues Monitoring-Werkzeug. JConsole bietet eine graphische Oberfläche zum Anzeigen von Leistungdaten und Ressourcenverbrauch von Java VMs und darauf laufender Java-Applikationen.
JConsole wurde mit Java SE 5 eingeführt und hat mit Java SE 6 nun endgültig den experimental Status verlassen. JConsole ist somit ein officially supported feature.
Voraussetzungen
JConsole kann direkt zum Monitoring von Java SE 6 Applikationen eingesetzt werden. Java SE 5 Applikationen müssen dagegen mit der Option -Dcom.sun.management.jmxremote gestartet werden. Mit dieser Option wird der benötigte management agent gestartet. Das ausführbare Programm jconsole ist unter JDK_HOME/bin zu finden.
Monitoring von lokalen Applikationen
JConsole kann mit und ohne Parameter gestartet werden. Ohne Angabe eines Parameters erfolgt die Auswahl einer Applikation über eine Auswahlbox. Dort sind lokale Java-Applikationen gelistet, zu denen JConsole eine Verbindung aufbauen kann.
Mit einem Parameter processID (PID) gestartet stellt JConsole direkt eine lokale Verbindung zur Applikation mit entsprechender PID her.
Es gibt mehrere Möglichkeiten, die PID einer Java-Applikationen zu ermitteln:
- via ps Kommando (auf Unix-Systemen) oder über den Task-Manager auf Windows-Systemen
- mit dem oben erwähnten jps Kommando.
Ein Beispiel-Aufruf kann dann so aussehen:
>jconsole 4711
Es versteht sich von selbst, dass es wenig sinnvoll ist Produktionssysteme lokal zu untersuchen. Durch das Monitoring wird ein System zusätzlich belastet. Die so erhaltenen Ergebnisse sind dann nicht wirklich aussagekräftig.
Monitoring von entfernten Applikationen
Damit JConsole zu einer entfernte Applikation Verbindung aufnehmen kann, muss diese mit der Option -Dcom.sun.management.jmxremote.port=portNum gestartet sein (es muss ein freier Port sein).
Ein Aufruf von JConsole zum Monitoring einer entfernten Applikation hat diese Form:
>jconsole hostName:portNum
hostName entspricht dabei dem System, auf dem die entfernte Applikation läuft. portNum entspricht dem Port, mit dem die entfernte Applikation gestartet wurde.
Aus Sicherheitsgründen ist eine SSL-basierte Passwort-Authentifizierung per Default eingeschaltet. Ein remoter Zugriff ist also nur bei Angabe eines Passworts möglich. Das macht Sinn, Fremde sind so nicht in der Lage beliebige Java-Applikationen zu testen.
Für einen ersten Test lässt sich die Sicherheitsabfrage aber abschalten. Die Java-Applikation muss zusätzlich mit den beiden Parametern -Dcom.sun.management.jmxremote.authenticate=false und -Dcom.sun.management.jmxremote.ssl=false gestartet werden. JConsole muss ebenfalls mit zusätzlichen Parametern gestartet werden:
>jconsole -J-Dcom.sun.management.jmxremote.authenticate=false \ -J-Dcom.sun.management.jmxremote.ssl=false hostname:port
Sieht falsch aus, ist aber korrekt so.
Was bietet JConsole?
JConsole gliedert sich in verschiedene Bereiche (Auswahl über Tabs):
- Overview: Überblick von Informationen der Java VM und Werten
- Memory: Informationen zum Speicherverbrauch
- Threads: Informationen über die Thread-Verwendung
- Classes: Informationen über geladene Klassen
- VM Summary: Informationen über die Java VM
- MBeans: Informationen über MBeans
- Plugins: Plug-in Mechanismus zum Einbinden eigener Erweiterungen.
Overwiew Tab
Der Overwiew Tab bietet auf einen Blick Informationen zur CPU- und Speicherauslastung, Anzahl der Threads und Anzahl der geladenen Klassen.
Memory Tab
Der Memory Tab gibt über den Speicherverbrauch und über die memory pools (heap und non-heap) einer Applikation Auskunft. Zu den memory pools zählen u.a. Eden Space (heap), Survivor Space (heap), Tenured Generation (heap), Permanent Generation (non-heap) und Code Cache (non-heap).
Ein Performance-Diagramm zeigt den zeitlichen Verlauf einer ausgewählten Speicherart an. In einer detaillierten Übersicht werden zusätzliche Informationen angezeigt.
Über den Knopf Perform GC kann jederzeit eine garbage collection ausgelöst werden.
Threads Tab
Der Threads Tab enthält Informationen zu den gerade laufenden Threads (Diagramm Threads über die Zeit, Liste mit gerade laufenden Threads und zusätzlich Detailinformationen zum ausgewählten Thread).
Mit dem Knopf Detect Deadlock kann man in Deadlocks befindliche Threads aufspüren.
Class Loading Tab
Mit dem Class Loading Tab erhält man Informationen über die Anzahl der gerade geladenen Klassen. Eine Detailansicht gibt darüber hinaus Auskunft über die Anzahl der seit dem Start der VM geladenen Klassen, sowie über die entladenen Klassen.
VM Information
Dieser Tab enthält Informationen zur gerade verbundenen VM. Neben Zusammenfassungen der zuvor beschriebenen Informationsseiten, gibt es zusätzliche Informationen (u.a. Uptime, Process CPU Time, VM arguments, Class-, Library-, Boot class path).
MBeans Tab
Der MBean Tab ermöglicht die vollständige Kontrolle aller MBeans die am auf der Plattform laufenden MBean Server registriert sind.
Plugins
JConsole verfügt über ein plug-in API mit dem sich weitere Tabs hinzufügen lassen, um z.B. applikationseigene MBeans abzufragen und anzuzeigen.
That's it
Das war es in Kürze. Weitere Details zu den einzelnen Bereichen würden den Rahmen dieses Beitrags sprengen. Diese können aber unter Using JConsole nachgelesen werden.
Fazit
JConsole und Konsorten sind gute Hilfsmittel, um Leistungsdaten von Java-Applikationen zu ermitteln und zu untersuchen. Das insbesondere JConsole nun ein officially supported feature ist, ist begrüßenswert, da somit erstmals ein Monitoring Tool direkt mit Java ausgeliefert wird.
