Treten in einer Java-basierten Anwendung qualitative Mängel im Hinblick auf Performance-Faktoren wie das Laufzeit- oder das Verbrauchsverhalten zutage, ist es für das Entwicklungsteam wichtig, mögliche Problembereiche effektiv einkreisen zu können.
Was sind Java Mission Control und der Flight Recorder?
Der Java Flight Recorder (JFR) bildet zusammen mit der Java Mission Control (JMC) eine Tool-Kette, um kontinuierlich detaillierte Laufzeitinformationen einer Java-Anwendung zu sammeln und auszuwerten. Beide Werkzeuge werden seit Java 7 (Update 40) mit dem Java Development Kit (JDK) ausgeliefert und sind auch in Oracles JRockit enthalten. Von Oracle ursprünglich als kommerzielles Feature entwickelt, ist inzwischen geplant, den Flight Recorder dem OpenJDK beizusteuern.
Java Mission Control
Java Mission Control ermöglicht es, sowohl lokal als auch remote Daten per Java Management Extension (JMX) zu sammeln. Remote-Instanzen können dabei per Java Discovery Protocol erkannt werden. Eine Plugin-API erlaubt die Erweiterung der Features der JMC, und auch für die gängigen Entwicklungsumgebungen sind Integrationen für JMC/JFR verfügbar.
Flight Recorder
Der Flight Recorder erlaubt ein Profiling mit sehr niedrigem Performance-Overhead, da Event-basiertes Monitoring direkt in die JVM integriert ist. Somit können wir das Tool mit entsprechend konfigurierten Profilen auch in stark belasteten Produktivumgebungen einsetzen, ohne zu starke zusätzliche Ressourcenbelastungen zu erzeugen.
Lizenzierung
Derzeit erfordert die Verwendung von Java Mission Control in der Produktion eine kommerzielle Lizenz. In Test- und Entwicklungssystemen kann JMC jedoch ohne Lizenz eingesetzt werden; sie wird nicht abgefragt oder hinterlegt. Der Flight Recorder wird - wie bereits erwähnt - vorrausichtlich auch mit dem OpenJDK verfügbar sein.
Flight Recorder aktivieren
Aktuell lässt sich der Flight Recorder aktivieren, indem wir beim Start der entsprechenden Java-Anwendung den folgenden Parameter verwenden:
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
Aufzeichnen mit Java Mission Control
Java Mission Control erlaubt es, sich per JMX zu lokalen oder Remote-Prozessen zu verbinden, und kann Java-Prozesse per Java Discovery Protokoll automatisch erkennen. JMC lässt sich mit dem Kommando jmc
starten.
Um eine Erkennung der Java-Prozesse zu ermöglichen, müssen wir an dieser Stelle gegebenenfalls die entsprechende virtuelle Maschine mit den folgenden Parametern starten:
-Dcom.sun.management.jmxremote.autodiscovery=true -Dcom.sun.management.jdp.name=Gruppe/Name-der-VM (optional)
Zunächst wählen wir aus der Liste der erkannten Prozesse den Java-Prozess aus:
Nun haben wir die Optionen, die JMX-Konsole zu starten, eine Aufzeichnung mithilfe des Flight Recorders zu initiieren oder den Remote-JMX-Agent zu steuern. Für unseren Anwendungsfall wählen wir die zweite Option.
Dann definieren wir, wo wir den Mitschnitt speichern möchten und ob die Aufzeichnung für eine definierte Dauer (beispielsweise 20 Minuten) oder kontinuierlich erfolgen soll - im letzteren Fall bis ein bestimmter Maximalwert im Hinblick auf die Dateigröße oder das Aufzeichnungsalter erreicht ist.
Außerdem können wir aus den bestehenden Templates, die sich über den Template-Manager konfigurieren und auch wiederverwenden lassen, unsere Event-Konfiguration auswählen.
In den nächsten Schritten haben wir schließlich die Möglichkeit, noch spezielle Einstellungen für die Ereigniserfassung zu konfigurieren - unter anderem Garbage Collector, Compiler und Thread-Dump-Intervall.
Nun kann die Aufzeichnung beginnen - hier am Beispiel einer Vert.x-Websocket-Anwendung:
Reports und Statistiken
Nach Abschluss der Aufzeichnung stehen uns diverse nützliche Statistiken und Reports zur Verfügung. Hier sind einige Beispiele.
Aufzeichnungsübersicht mit CPU, Heap-Nutzung und JVM-Informationen:
Informationen zu Speicherverwendung, Inhalten des Heap, Garbage-Collection-Informationen:
Code-Statistiken mit Klassen- und Methoden-Häufigkeiten, Exception-Statistiken, Classloader-Detailinformationen und mehr:
Thread-Details und Thread-Lock-Informationen:
Wir können auch nach Ereignistypen filtern:
Export
Java Mission Control erlaubt es uns, über die Exportfunktion bestehende Verbindungen, Flight-Recording-Templates und Trigger-Regeln zu exportieren:
Aufzeichnung über die Kommandozeile
Es ist darüber hinaus möglich, über die Kommandozeile ein Programm auszuführen und gleichzeitig die Metriken mithilfe des Flight Recorders zu erfassen. Die folgende Zeile startet die 60-sekündige Aufzeichnung für eine Anwendung in einer ausführbaren Jar-Datei:
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=seibert-vertx-recording.jfr -jar app.jar
Für bereits gestartete Prozesse können wir mittels des Kommandozeilen-Programms jcmd
die Datenerfassung zu starten.
Zur Identifizierung wird hier die Java-Prozess-ID verwendet: Läuft beispielsweise unsere Anwendung unter der Java-Prozess-ID 12345
(mit jps
oder jcmd
ermittelbar), so lässt sich eine Aufzeichnung mit dem folgenden Befehl initiieren:
jcmd 12345 JFR.start duration=60s filename=seibert-vertx-live-recording.jfr
Anschließend können wir diese Datei wieder in die grafische Oberfläche von Java Mission Control importieren und wie gewohnt die Reports und Statistiken einsehen.
Eine kurze Auflistung der gängigen Befehle aus allen Beispielen finden sich auch in diesem Blog-Artikel wieder.
Ihr Partner für individuelle Software-Projekte
Planen Sie bereits ein konkretes Software-Projekt? Oder gibt es bestimmte Prozesse in Ihrem Unternehmen, die Ihnen schon lange Kopfzerbrechen bereiten? Bremst ein System oder eine Schnittstelle Ihre Mitarbeiter auf der einen oder Ihre Kunden auf der anderen Seite aus? Dann sprechen Sie mit uns darüber! Wir freuen uns darauf, gemeinsam eine individuelle Lösung zu entwickeln – bei höchster Qualität und voller Kostenkontrolle.
Weiterführende Infos
Was agile Software-Projekte dem Kunden bringen
Vorgehen nach Scrum: Die beste Wahl für den Kunden, die Agentur – und das Produkt
Echte Integration: Das Zusammenspiel von JIRA, Stash und Bamboo im Entwicklungsprozess
Der Beginn eines Happy Ends: Initialer Anforderungs-Workshop für erfolgreiche Projekte
Darum ist eine regelmäßige Kundenpräsenz beim Entwicklungsteam so sinnvoll
Mehr über die Creative-Commons-Lizenz erfahren