Java Mission Control

Artikel als PDF herunterladen:
Download Java Mission Control

Die Entwicklung ist abgeschlossen. Alles ist gut getestet und schon ist die Anwendung im Produktivbetrieb. Schön, wenn jetzt alles stabil läuft. Und was wenn nicht? Dann heißt es möglichst schnell mit Analyse-Ergebnissen aufzuwarten. Was führte wann und warum zu Abweichungen im Verhalten der Anwendung? Ohne repräsentative Datenbasis und ein entsprechend aufeinander abgestimmtes Tooling kommt man jetzt schnell ins Schwitzen. Gut zu wissen, dass in Oracles JDK mit Java Mission Control eine geradezu perfekte Toolkette für solche Fälle bereits vorhanden ist.

So manch einer mag sich noch an die Zeiten vor der „Java-Einkaufstour“ von Oracle erinnern. Da gab es den WebLogic-Application Server noch von BEA. Der erfreute sich, nicht zuletzt ob seiner JVM-Implementierung JRockit, einer gewissen Beliebtheit. Die JRockit-VM lieferte bereits damals genau das, was den Betrieb von Anwendungen durchaus zu einer angenehmen Angelegenheit machen konnte: Live-taugliche Monitoring- und Analysewerkzeuge auf JVM-Ebene. Heute gehört BEA, und damit auch JRockit, zu Oracle. Und weil seit ein paar Jahren nun auch Sun und die HotSpot-JVM zu Oracle gehören, wird seit geraumer Zeit an einer „Fusion“ der unterschiedlichen JVMs gearbeitet. So kommt es, dass die vormals unter JRockit Mission Control bekannten Tools seit dem Update 40 auf Java Version 7 in Form von Java Mission Control Bestandteil des von Oracle ausgelieferten JDKs sind.

Bevor wir die Toolkette rund um Java Mission Control genauer unter die Lupe nehmen, zunächst ein Blick auf die wichtigsten Eckdaten: Mit einem aktuellen JDK 1.8 erhält man Java Mission Control in Version 5.5. Es bietet eine JMX-Console und ein Java Flight Recorder genanntes Profiling- und Diagnosewerkzeug. Was aus dem bislang präferierten JVM-Monitoringwerkzeug VisualVM wird, lässt sich aktuell nur mutmaßen. Java Mission Control gehört im Zusammenhang mit Oracles JDK sicher die Zukunft. VisualVM liegt dem JDK zwar noch bei, es besteht jedoch Anlass zu der Vermutung, dass es in Zukunft sein Dasein wohl eher als quell-offenes Tool im OpenJDK fristen wird. Gehen wir also mit der Zeit und starten wir unsere erste Mission mit Java Mission Control.

Erste Schritte mit Java Mission Control

Die Kommandozentrale von Java Mission Control kommt in Form einer Eclipse-basierten Anwendung daher. Im Binary-Verzeichnis des JDK tut es der Aufruf von

$JDK_HOME/bin/jmc

bzw.

%JDK_HOME%\bin\jmc.exe

und die Stand-Alone-Variante steht zur Verfügung. Arbeitet man mit Eclipse-IDE, ist die Integration des Werkzeugs mittels Plugin über die von Oracle zur Verfügung gestellte Update-Site möglich.

Vorausgesetzt es laufen keine weiteren Java-Prozesse, bekommen wir zunächst die JVM-Instanz aufgelistet, in welcher das Werkzeug selbst läuft. Durch Doppelklick auf den in der Baumstruktur dargestellten MBean-Server bauen wir eine Verbindung auf und bekommen nun Zugriff auf die MBeans der betreffenden JVM. Einige der angebotenen Views bieten Laufzeitinformationen in grafisch aufbereiteter Form – alles erinnert ein bisschen an VisualVM.

Abbildung 1: Oracle Java Mission Control
Abbildung 1: Oracle Java Mission Control

Interessant sind jedoch die Möglichkeiten zum Erstellen unterschiedlicher Trigger. Hier zeigt sich, dass Java Mission Control sich nicht ausschließlich als Entwicklungswerkzeug positionieren möchte. Vielmehr nimmt es gerade auch den Anwendungsbetrieb als mögliches Einsatzgebiet für sich in Anspruch. So lassen sich beispielsweise E-Mails beim Erreichen definierter Grenzwerte versenden – oder aber so genannte Flight Recordings starten. Diese basieren auf einigen erweiterten Möglichkeiten, Laufzeitdaten der JVM mithilfe des Java Flight Recorders aufzuzeichnen und sind der eigentliche Kern von Java Mission Control. Lassen Sie uns also einen Blick auf diesen Mechanismus werfen.

Java Flight Recorder

Mit dem Java Flight Recorder bekommt die von Oracle ausgelieferte HotSpot-JVM gewissermaßen einen Flugdatenschreiber verpasst. Dieser lässt sich in verschiedenen Konfigurationen betreiben und zeichnet entweder für eine definierte Zeitspanne oder aber permanent laufzeitrelevante Daten seiner JVM auf. Das Ziel ist hierbei nicht die Unterstützung eines „Live-Monitorings“, welches durch die Java Management Extensions ja hinreichend abgedeckt ist. Vielmehr geht es darum, alle notwendigen Daten für nachgelagerte Laufzeitanalysen einzusammeln. Damit schafft der Java Flight Recorder eine erstklassige Möglichkeit, z. B. im Fall von problembehaftetem Verhalten einer Anwendung, auf Daten zurückgreifen zu können, die den Zustand des Systems zum betreffenden Zeitpunkt präzise repräsentieren. Zum Chanon der gesammelten Daten zählen unter anderem Garbage Collection Statistiken, mögliche Compileroptimierungen zur Laufzeit, Latenzen von I/O-Operationen und Locks, Heap-Statistiken und vieles andere mehr. Durch die interne Architektur des Flight Recoders wird sichergestellt, dass diese doch recht umfangreiche Datensammlung nur minimale Auswirkungen auf die Gesamtperformance der eigentlichen Anwendung hat. Glaubt man den Aussagen des Herstellers, liegt der Impact auf die Anwendungsperformance zwischen ein und zwei Prozent. Die Vorteile liegen also auf der Hand – allein der für den Einsatz in Produktivumgebungen erforderliche Lizenzerwerb sollte im Vorfeld bedacht werden. Java Mission Control ist eines der von Oracle in die Hotspot-JVM integrierten, kommerziellen Features. Für den Einsatz in der Anwendungsentwicklung ist allerdings kein separater Lizenzerwerb erforderlich. Auch hier, also schon weit im Vorfeld des Produktivbetriebs, kann die Toolkette gute Dienste leisten. Lenken wir unsere Aufmerksamkeit also auf diesen Aspekt und lassen Sie uns den Einsatz des Java Flight Recorders als Profiling-Tool in der Entwicklung betrachten.

Abbildung 2: Start Flight Recording
Abbildung 2: Start Flight Recording

Um eine Analyse mithilfe von Java Flight Recorder und Java Mission Control durchzuführen, starten wir zunächst die Anwendung unter Angabe von zwei zusätzlichen VM-Parametern:

-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder

Flight-Recordings können auf unterschiedliche Arten gestartet werden. Zum einen lässt sich beim Starten der JVM mit entsprechendem Parameter die Aufzeichnung konfigurieren:

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder

Darüber hinaus gibt es die Möglichkeit, sich über das JCMD-Tool zum gewünschten Java-Prozess zu verbinden und ein Flight-Recording via Commandline zu initiieren. Wir entscheiden uns für die dritte Möglichkeit – das Java Mission Control-Frontend. Von hier aus können Flight-Recording-Sessions konfiguriert, gestartet und später auch ausgewertet werden. Navigieren wir also zum Java-Prozess unserer Anwendung und wählen aus dem Kontextmenü den Punkt „Start Flight Recording“ aus. Im nun folgenden Dialog dürfen wir noch genauer über Art und Umfang der zu sammelnden Daten sowie die Dauer der Aufzeichnung entscheiden. Fürs Erste kommen wir mit dem bereits vorhandenen Template „Profiling on server“ über die Runden.

Die aufgezeichneten Daten werden vom Java Flight Recorder nach Ablauf der vorgegebenen Aufzeichnungsdauer in eine Datei gespeichert, die wir zur Auswertung wiederum in Java Mission Control einlesen. Die Unterstützung des Tools, der oft recht großen Menge aufgezeichneter Daten die nötigen Erkenntnisse zu entlocken, lässt hierbei kaum Wünsche offen. Schön gelöst ist vor allem die zeitliche Quantisierung. So lässt sich der Fokus auf interessante Zeitpunkte eingrenzen und man wird nicht von der Gesamtmenge der eingesammelten Daten erschlagen. Ohne Probleme lassen sich so die unterschiedlichsten Fragestellungen im Handumdrehen beantworten: In welchen Methoden der Anwendung verbringt die JVM, relativ zur gesamten Ausführungsdauer, die meiste Zeit? Ein Klick auf den Abschnitt „Code“ eines Flight Recordings und schon finden wir eine Zusammenfassung aller „Hot Methods“.

Liste aller Hot Methods
Abbildung 3: Liste aller Hot Methods

Oder: Auf welche Teile der Anwendung lassen sich Latenzen und Lock-Contentions zurückführen? Ein Klick auf den Abschnitt „Threads“ und wir finden auch diese Informationen in entsprechend aufbereiteter Form.

Nun gilt es nur noch die richtigen Schlüsse im Hinblick auf die Fehlerbeseitigung oder Optimierung der Anwendung zu ziehen. Die Beschaffung eines gesonderten Java-Profilers ist mit der Verfügbarkeit von Java Mission Control in vielerlei Hinsicht überflüssig geworden.

Fazit

Das Gesamtpaket rund um Java Mission Control macht einen erfreulich praxistauglichen Eindruck. Der dargebotene Werkzeugkasten unterstützt in erster Linie bei der Lösung von Problemen, die Lernkurve ist verhältnismäßig gering. Die Jahre, die die Toolkette seit ihrer Einführung in BEAs JRockit auf dem Buckel hat, haben sie ganz offensichtlich wie einen guten Wein reifen lassen. Wer bislang noch nicht in die Verlegenheit gekommen ist, einen Blick auf Java Mission Control zu werfen, dem sei es nicht erst zur Analyse des nächsten Memoryleaks aus dem Livesystem ans Herz gelegt. Einfach mal reinschauen – es lohnt sich.

Kommentare sind abgeschaltet.