Java Academy · Lektion

Java Flight Recorder

Profilering med lav overhead

Lektion 2 af 413 trin

Java Flight Recorder er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad er JFR?

Java Flight Recorder (JFR) er en motor til profilering og indsamling af hændelser, som er bygget direkte ind i JVM'en.

Den registrerer detaljerede hændelser fra kørselstiden — stikprøver af metoder, allokeringer, GC, låse og I/O — i en binær .jfr-fil med meget lav belastning. Den følger med JDK'et; ingen ekstra agent er nødvendig.

Hvorfor lav belastning er vigtig

Traditionelle instrumenterende profiler kan gøre en applikation dobbelt så langsom eller mere og dermed forvrænge netop de tidsmålinger, du vil bruge.

JFR er designet til at køre i produktionen med typisk omkring 1 % ekstra belastning. Det betyder, at du kan lade det være aktiveret og optage data, når en reel hændelse opstår, ikke kun i et testmiljø.

Start af optagelse ved opstart

Aktivér JFR med et JVM-flag, når du starter din applikation:

  • -XX:StartFlightRecording=duration=60s,filename=app.jfr

Dette registrerer hændelser i 60 sekunder og skriver dem derefter til app.jfr. Du kan også starte en optagelse, der kører, indtil JVM'en afsluttes.

Styring med jcmd

Du kan også starte, stoppe og udlæse optagelser på en kørende JVM ved hjælp af jcmd:

  • jcmd <pid> JFR.start name=rec settings=profile
  • jcmd <pid> JFR.dump name=rec filename=out.jfr
  • jcmd <pid> JFR.stop name=rec

Det er ideelt til at hente et øjebliksbillede fra en proces, der allerede opfører sig forkert.

Indstillinger: default kontra profile

JFR leveres med to indbyggede konfigurationer:

  • default — minimal belastning, sikkert til kontinuerlig brug i produktionen.
  • profile — mere detaljerede stikprøver, lidt højere belastning, til målrettet undersøgelse.

Vælg med settings=profile. Du kan også skrive en brugerdefineret .jfc-konfiguration for at justere individuelle hændelser.

Hvad JFR registrerer

JFR registrerer et rigt sæt hændelser, herunder:

  • Udførelsesstikprøver (hvor CPU-tiden bruges).
  • Allokering af objekter og TLAB-aktivitet.
  • Pauser i affaldsopsamlingen.
  • Konkurrence om låse (jdk.JavaMonitorWait).
  • I/O for filer og sockets, parkerede tråde og undtagelser.

Hver hændelse har et tidsstempel, en varighed og et stackspor.

Brugerdefinerede hændelser

Du kan definere dine egne JFR-hændelser for at tidsmåle forretningslogik. Udvid jdk.jfr.Event, annotér den, og kald derefter begin() / commit() omkring arbejdet.

Denne del af JFR's API er velegnet til selvstændig brug. En reel optagelse kræver stadig JVM-flagene, men hændelsesklassen kan kompileres og køres på enhver JDK.

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);
    }
}

Kontinuerlig optagelse

For tjenester, der kører i lang tid, kan du køre en kontinuerlig optagelse med en begrænset størrelse eller alder (en ringbuffer).

Gamle hændelser fjernes, efterhånden som nye ankommer, så diskforbruget forbliver begrænset. Når en hændelse opstår, udlæser du bufferen og har straks de minutter, der gik forud for den.

Udskrivning ved afslutning

Tilføj dumponexit=true til et startflag for flyveoptagelsen, så skriver JFR bufferen, når JVM'en lukker ned.

Kombinér med -XX:FlightRecorderOptions for at indstille bufferstørrelsen. Det sikrer, at du indsamler data, selv fra en proces, der er ved at afslutte.

Læsning af filen

En .jfr-fil er binær. Du analyserer den visuelt i JDK Mission Control (næste lektion) eller programmatisk med jdk.jfr.consumer-API'et og RecordingFile.

Kommandolinjen jfr print app.jfr kan også udlæse hændelser som tekst til hurtig grep-søgning.

Streaming af hændelser i realtid

Siden JDK 14 understøtter JFR streaming af hændelser via jdk.jfr.consumer.RecordingStream-API'et.

I stedet for at udlæse en fil og åbne den senere abonnerer du på hændelser, efterhånden som de sker, og reagerer i realtid — for eksempel ved at sende en alarm, når GC-pauser overstiger en tærskel. Det gør JFR til en kilde til liveovervågning, ikke kun et værktøj til efterfølgende analyse.

Hurtigt tjek

Hvad er den vigtigste grund til, at JFR kan køre kontinuerligt i produktionen?

Opsummering

JFR er JVM'ens indbyggede flyvedataoptager:

  • Hændelsesindsamling med lav belastning, der er sikker i produktionen, til .jfr-filer.
  • Start via -XX:StartFlightRecording eller jcmd JFR.start.
  • Vælg indstillingerne default eller profile; definér brugerdefinerede hændelser.
  • Brug kontinuerlig optagelse med ringbuffer og dumponexit.
  • Analysér i JDK Mission Control i næste lektion.
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “Java Flight Recorder” gratis?

Ja — hele teksten til “Java Flight Recorder” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Java Flight Recorder”?

Profilering med lav overhead Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Java Flight Recorder”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Identificering af flaskehalse
  2. Java Flight Recorder
  3. Analyse med JDK Mission Control
  4. Almindelige JVM-tuningflag
← Tilbage til Java Academy