Definition

Java Flight Recorder

Java Flight Recorder ist ein Profiler für die Java Virtual Machine (JVM), der Leistungsmetriken sammelt, ohne die Ressourcen wesentlich zu belasten. Der Profiler ist so konzipiert, dass er kontinuierlich eingeschaltet bleibt – sogar in Produktionssystemen – so dass eine untersuchbare Event-Historie existiert, selbst wenn die virtuelle Maschine abstürzt.

Java Mission Control

Java Flight Recorder und das dazugehörige Tool Java Mission Control wurden ursprünglich von Appeal Virtual Machines (AVM), einem schwedischen Softwareunternehmen, entwickelt. AVM entwickelte auch JRockit, eine VM, die sich auf Laufzeitleistung und Bytecode-Optimierung spezialisierte. AVM wurde 2002 von BEA Systems und 2008 von Oracle übernommen.

Eine kommerziell lizenzierte Version von Java Flight Recorder wurde 2013 in Oracles HotSpot JVM als Teil einer aktualisierten Java-7-Version integriert. Eine unlizenzierte Nutzung von Java Mission Control und Java Flight Recorder in Produktionsumgebungen war nicht möglich, bis Oracle diese Tools 2018 für die Open Source Community freigab. JDK 11 war das erste langfristige Support-Release, das Open-Source-lizenzierte Versionen dieser Tools enthielt.

Java Flight Recorder und JVM-Optimierung

Das ursprüngliche Ziel von Java Mission Control und Java Flight Recorder war es, die Entwicklung und Optimierung der JRockit JVM zu unterstützen. Ein Entwickler konnte die gesammelten Metriken verwenden, um Folgendes besser zu verstehen:

  • wie sich die JVM zur Laufzeit verhält;
  • wie die JVM unter verschiedenen Lasten Ressourcen zuweist;
  • wo Engpässe bei der Verarbeitung von Bytecode auftreten; und
  • wie und wann Just-in-Time-Kompilierungen durchgeführt werden.

Während der ursprüngliche Zweck von Java Flight Recorder darin bestand, einen Einblick in die Funktionsweise der zugrunde liegenden JVM zu geben, wurde schnell klar, dass diese Metriken auch für Softwareentwickler, die an der Untersuchung der Anwendungsleistung interessiert sind, äußerst wertvoll sind.

Java Flight Recorder Metriken
Abbildung 1: Java Flight Recorder bietet Einblicke, wie eine Java-App Laufzeitressourcen nutzt.

Optimierungen durch Java Flight Recorder

Ein Nachteil vieler Anwendungs-Profiling-Tools ist, dass sie die Laufzeit-Performance beeinträchtigen können. Java Flight Recorder wurde entwickelt, um dieses Problem zu entschärfen. Ein Entwickler kann ihn kontinuierlich im Hintergrund laufen lassen, sogar auf Produktionssystemen.

Eine Möglichkeit, die Laufzeitbelastung zu reduzieren, besteht darin, dass es intern innerhalb der JVM arbeitet. Die meisten JDK-Profiling-Tools erfordern, dass ein Entwickler zusätzliche Komponenten auf der JVM installiert, die dann Metriken an ein externes Datenerfassungs-Tool melden. Diese Kommunikation zwischen der JVM und einem externen Monitoring Tool kann die Leistung beeinträchtigen.

Java Flight Recorder minimiert die Beeinträchtigung der Leistung weiter durch die Tabellierung von Daten, die bereits von der JVM verwaltet werden, anstatt neue Mechanismen zu implementieren, die die Leistung verfolgen.

Zum Beispiel verfolgt jede JVM die Speichernutzung, aktive Threads, Heap-Größe und Garbage-Collection-Routinen als Teil ihrer normalen, laufenden Laufzeit. Java Flight Recorder zapft diese bereits berechneten Metriken an und zeichnet sie auf.

Instrumentierung versus Sampling

Java Flight Recorder minimiert seine Laufzeitbelastung auch durch Sampling von Daten während des gesamten Lebenszyklus der Anwendung. Es wird nicht jedes einzelne Auftreten eines Thread-Blocks oder einer Objekterzeugung erfasst. Stattdessen zeichnet Java Flight Recorder zufällig Metriken in unregelmäßigen Abständen auf.

Auch wenn einzelne Ereignisse möglicherweise nicht erfasst werden, sammelt Java Flight Recorder im Laufe der Zeit genügend Informationen, um ein genaues Bild von der Leistung der JVM zu zeichnen.

Im Hinblick auf die Fehlersuche ist das Anwendungsverhalten über einen längeren Zeitraum meist aussagekräftiger als einzelne Ereignisse. Noch wichtiger ist, dass Sampling viel effizienter ist als Low-Level-Instrumentierung. Eine Standardkonfiguration von Java Flight Recorder hat weniger als einen Prozent Leistungseinfluss auf die Systemressourcen, während eine umfangreiche Profilerstellung wahrscheinlich nicht mehr als zwei Prozent ausmachen wird.

Metriken in Java Flight Recorder

Ein Entwickler kann einige oder alle der folgenden Metriken verwenden, um Anwendungen zu überwachen und Probleme zu beheben:

  • Thread-Aktivität
  • Objektzuweisung
  • Instanzsperren
  • Datei- und Socket-I/O
  • Anzahl der Ausnahmen
  • Garbage-Collection-Zeit
  • Code-Cache und Kompilierung
  • TLAB-Zuweisungen
  • G1-Heap-Layout
  • VM-Operationen
  • Speicherverbrauch
  • Anzahl der Live-Objekte

Kontinuierliches Application Profiling

Java Flight Recorder funktioniert ähnlich wie die Blackbox eines Flugzeugs. Er ist so konzipiert, dass er immer eingeschaltet ist und die Ereignisse aufzeichnet, die zu einem bestimmten Ereignis führen.

Wenn beispielsweise die kontinuierliche Profilerstellung aktiviert ist und eine JVM abstürzt, schreibt der Java Flight Recorder alle Daten, die er im Speicher hält, in das lokale Dateisystem. Diese Funktion ermöglicht es einem Entwickler und DevOps-Team, die verschiedenen Ausführungsmuster vor dem Ausfall zu untersuchen.

Wie man Java Flight Recorder startet

Neben dem kontinuierlichen Aufzeichnungsmodus kann ein Entwickler den Java Flight Recorder auch explizit starten, ihn für eine bestimmte Zeit laufen lassen und anschließend die Aufzeichnung überprüfen.

Ein Entwickler kann auch Trigger innerhalb von Java Mission Control aktivieren. Zum Beispiel kann ein MBean, das die CPU-Auslastung oder den Speicherverbrauch überwacht, den Start von Java Flight Recorder auslösen, wenn die Auslastung einen Schwellenwert von 80 Prozent überschreitet.

Mit Java 14 wurde die Möglichkeit eingeführt, Java-Flight-Recorder-Metriken für Echtzeit-Profiling zu streamen. Außerdem kann das JDK mehrere Java-Flight-Recorder-Aktivitäten gleichzeitig ausführen, wodurch ein Entwickler verschiedene Aufzeichnungsoptionen gleichzeitig ausführen kann.

Java Flight Recorder und Java Mission Control

Java Flight Recorder speichert seine Daten in einem binären Format. Für die Datenanalyse ist ein zusätzliches Tool erforderlich, um die Informationen zu parsen. Java Mission Control ist de facto das Datenvisualisierungs-Tool, das mit Java Flight Recorder verwendet wird, obwohl auch andere Tools, zum Beispiel VisualVM, Java-Flight-Recorder-Dateien lesen können.

Da Java Mission Control Open Source ist, ist es auch von einer Vielzahl von JDK-Anbietern erhältlich, unter anderem:

  • Azul
  • Oracle
  • Red Hat
  • AdoptOpenJDK
  • Eclipse Adoptium
  • Java Flight Recorder API
Java Mission Control
Abbildung 2: Java Mission Control stellt die Daten des Java Flight Recorders visuell ansprechend und leicht verständlich dar.

Java Flight Recorder API

Die Java Flight Recorder API ermöglicht das Parsen, Verarbeiten und Interpretieren von Datendateien auf eine sehr individuelle Weise. Dadurch ist es möglich, eine Headless-Analyse von Aufzeichnungen durchzuführen.

Tools, die die JFR-API zur Erstellung von Flammendiagrammen und Methodenhistogrammen verwenden, sind zwei beliebte Beispiele für Performance-Analyse-Tools, die die Möglichkeiten von Java Flight Recorder und Java Mission Control erweitern.

Diese Definition wurde zuletzt im Februar 2021 aktualisiert

Erfahren Sie mehr über Softwareentwicklung