Analyse einer Java-Anwendung mit Java Mission Control und Flight Recorder

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:

Mit Java Prozess verbinden

Mit Java-Prozess verbinden

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.

Mit FlightRecorder verbinden

Mit Flight Recorder verbinden

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.

Aufzeichnungseinstellungen konfigurieren

Aufzeichnungseinstellungen konfigurieren

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.

Weitere Eventkonfiguration

Weitere Event-Konfiguration - 1

Weitere Eventkonfiguration - 2

Weitere Event-Konfiguration - 2

Nun kann die Aufzeichnung beginnen - hier am Beispiel einer Vert.x-Websocket-Anwendung:

Laufende Aufzeichnung

Laufende Aufzeichnung

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:

Aufzeichnungsübersicht

Aufzeichnungsübersicht

Informationen zu Speicherverwendung, Inhalten des Heap, Garbage-Collection-Informationen:

Speicherstatistiken

Speicherstatistiken

Code-Statistiken mit Klassen- und Methoden-Häufigkeiten, Exception-Statistiken, Classloader-Detailinformationen und mehr:

Code-Statistiken

Code-Statistiken

Thread-Details und Thread-Lock-Informationen:

Thread-Analyse

Thread-Analyse

Wir können auch nach Ereignistypen filtern:

Filterung nach Eventtyp

Filterung nach Event-Typ

Export

Java Mission Control erlaubt es uns, über die Exportfunktion bestehende Verbindungen, Flight-Recording-Templates und Trigger-Regeln zu exportieren:

JMC Exportfunktion

JMC-Exportfunktion

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