Java Flight Recorder
Profiling mit geringem Overhead
Java Flight Recorder ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist JFR?
Java Flight Recorder (JFR) ist eine direkt in die JVM integrierte Engine für Profiling und Ereigniserfassung.
JFR zeichnet detaillierte Laufzeitereignisse – Methodensamples, Allokationen, GC, Sperren und IO – mit sehr geringem Overhead in einer binären .jfr-Datei auf. JFR wird mit dem JDK ausgeliefert; ein zusätzlicher Agent ist nicht erforderlich.
Warum geringer Overhead wichtig ist
Herkömmliche instrumentierende Profiler können eine Anwendung um das Zweifache oder mehr verlangsamen und dadurch genau die Zeitmessungen verfälschen, die Sie untersuchen möchten.
JFR ist dafür ausgelegt, im Produktivbetrieb mit typischerweise etwa 1 % Overhead zu laufen. Sie können JFR daher aktiviert lassen und eine Aufzeichnung erstellen, wenn tatsächlich ein Problem auftritt – nicht nur im Labor.
Eine Aufzeichnung beim Start beginnen
Aktivieren Sie JFR beim Start Ihrer Anwendung mit einem JVM-Flag:
-XX:StartFlightRecording=duration=60s,filename=app.jfr
Dadurch werden 60 Sekunden lang Ereignisse aufgezeichnet und anschließend in app.jfr geschrieben. Sie können auch eine Aufzeichnung starten, die bis zum Beenden der JVM läuft.
Steuern mit jcmd
Mit jcmd können Sie Aufzeichnungen auch in einer laufenden JVM starten, stoppen und speichern:
jcmd <pid> JFR.start name=rec settings=profilejcmd <pid> JFR.dump name=rec filename=out.jfrjcmd <pid> JFR.stop name=rec
Das ist ideal, um einen Schnappschuss eines Prozesses zu erstellen, der sich bereits fehlerhaft verhält.
Einstellungen: default vs profile
JFR wird mit zwei integrierten Konfigurationen ausgeliefert:
- default – minimaler Overhead, sicher für den kontinuierlichen Einsatz im Produktivbetrieb.
- profile – detaillierteres Sampling mit etwas höheren Kosten für gezielte Untersuchungen.
Wählen Sie die Konfiguration mit settings=profile. Sie können auch eine benutzerdefinierte .jfc-Konfiguration schreiben, um einzelne Ereignisse anzupassen.
Was JFR aufzeichnet
JFR erfasst eine große Bandbreite an Ereignissen, darunter:
- Ausführungssamples, die zeigen, wo CPU-Zeit verwendet wird.
- Objektallokationen und TLAB-Aktivität.
- Pausen durch die Garbage Collection.
- Sperrenkonflikte (
jdk.JavaMonitorWait). - Datei- und Socket-IO, geparkte Threads und Ausnahmen.
Jedes Ereignis enthält einen Zeitstempel, eine Dauer und einen Stacktrace.
Benutzerdefinierte Ereignisse
Sie können eigene JFR-Ereignisse definieren, um Geschäftslogik zeitlich zu erfassen. Erweitern Sie jdk.jfr.Event, versehen Sie die Klasse mit einer Annotation und rufen Sie begin() und commit() rund um die zu messende Arbeit auf.
Das ist der Teil der JFR-API, der sich besonders gut für eigenständige Anwendungen eignet. Für eine tatsächliche Aufzeichnung werden weiterhin die JVM-Flags benötigt, aber die Ereignisklasse lässt sich auf jedem JDK kompilieren und ausführen.
import jdk.jfr.Event;
import jdk.jfr.Label;
public class Main {
@Label("Order Processing")
static class OrderEvent extends Event {
@Label("Order Id") int orderId;
}
public static void main(String[] args) {
OrderEvent e = new OrderEvent();
e.orderId = 42;
e.begin();
// ... do the work being measured ...
e.commit();
System.out.println("Custom JFR event committed for order " + e.orderId);
}
}Kontinuierliche Aufzeichnung
Führen Sie bei langlebigen Diensten eine kontinuierliche Aufzeichnung mit begrenzter Größe oder begrenztem Alter aus, also einen Ringpuffer.
Alte Ereignisse werden verworfen, sobald neue hinzukommen, sodass der Speicherplatz begrenzt bleibt. Wenn ein Problem auftritt, speichern Sie den Puffer und verfügen sofort über die Minuten, die ihm vorausgingen.
Beim Beenden speichern
Fügen Sie einem Start-Flight-Recording-Flag dumponexit=true hinzu; dann schreibt JFR den Puffer beim Herunterfahren der JVM.
Kombinieren Sie dies mit -XX:FlightRecorderOptions, um die Puffergröße festzulegen. So stellen Sie sicher, dass auch von einem Prozess, der kurz vor dem Beenden steht, Daten erfasst werden.
Die Datei lesen
Eine .jfr-Datei ist binär. Sie analysieren sie visuell in JDK Mission Control (in der nächsten Lektion) oder programmgesteuert mit der jdk.jfr.consumer-API und RecordingFile.
Mit der Befehlszeile jfr print app.jfr können Sie Ereignisse auch als Text ausgeben und schnell durchsuchen.
Ereignisse live streamen
Seit JDK 14 unterstützt JFR Event-Streaming über die jdk.jfr.consumer.RecordingStream-API.
Statt eine Datei zu speichern und später zu öffnen, abonnieren Sie Ereignisse, sobald sie auftreten, und reagieren in Echtzeit darauf – beispielsweise indem Sie eine Meldung auslösen, wenn GC-Pausen einen Schwellenwert überschreiten. Dadurch wird JFR zu einer Quelle für Live-Monitoring und nicht nur zu einem Werkzeug für nachträgliche Analysen.
Kurzer Test
Aus welchem Hauptgrund kann JFR im Produktivbetrieb dauerhaft aktiviert bleiben?
Zusammenfassung
JFR ist der integrierte Flugdatenschreiber der JVM:
- Ereigniserfassung mit geringem Overhead und sicherem Einsatz im Produktivbetrieb in
.jfr-Dateien. - Start über
-XX:StartFlightRecordingoderjcmd JFR.start. - Wählen Sie die Einstellungen default oder profile und definieren Sie benutzerdefinierte Ereignisse.
- Verwenden Sie kontinuierliche Aufzeichnungen im Ringpuffer und
dumponexit. - Analysieren Sie die Aufzeichnung als Nächstes in JDK Mission Control.
Lerne Java mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 104
- Lektionen
- 374
Häufig gestellte Fragen
Ist die Lektion „Java Flight Recorder“ kostenlos?
Ja — der vollständige Text von „Java Flight Recorder“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Java Flight Recorder“?
Profiling mit geringem Overhead Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Java Flight Recorder“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Bottlenecks identifizieren
- Java Flight Recorder
- Analysieren mit JDK Mission Control
- Gängige JVM-Tuning-Flags