Java Academy · leksjon

Java Flight Recorder

Profilering med lav belastning

Leksjon 2 av 413 trinn

Java Flight Recorder er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva er JFR?

Java Flight Recorder (JFR) er en motor for profilering og innsamling av hendelser som er bygget direkte inn i JVM-en.

Den registrerer detaljerte kjøretidshendelser — metodeeksempler, allokeringer, GC, låser, IO — i en binær .jfr-fil, med svært liten overhead. Den følger med JDK-en; ingen ekstra agent er nødvendig.

Hvorfor lav overhead er viktig

Tradisjonelle instrumenterende profiler kan gjøre en app to ganger tregere eller mer, og dermed forvrenge nettopp målingene du ønsker.

JFR er utformet for å kjøre i produksjon med typisk rundt 1 % overhead. Det betyr at du kan la det være aktivert og ta opp data når en reell hendelse oppstår, ikke bare i et testmiljø.

Starte et opptak ved oppstart

Aktiver JFR med et JVM-flagg når du starter applikasjonen:

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

Dette registrerer hendelser i 60 sekunder og skriver dem deretter til app.jfr. Du kan også starte et opptak som kjører til JVM-en avsluttes.

Styre med jcmd

Du kan også starte, stoppe og dumpe opptak på en kjørende JVM ved hjelp av jcmd:

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

Dette er ideelt for å hente et øyeblikksbilde fra en prosess som allerede oppfører seg feil.

Innstillinger: default vs profile

JFR leveres med to innebygde konfigurasjoner:

  • default — minimal overhead, trygt for kontinuerlig bruk i produksjon.
  • profile — mer detaljert sampling, litt høyere kostnad, for målrettet undersøkelse.

Velg med settings=profile. Du kan også skrive en egendefinert .jfc-konfigurasjon for å finjustere individuelle hendelser.

Hva JFR registrerer

JFR fanger opp et rikt utvalg av hendelser, blant annet:

  • Utføringssamples (hvor CPU-tiden brukes).
  • Objektallokering og TLAB-aktivitet.
  • GC-pauser.
  • Låsekonkurranse (jdk.JavaMonitorWait).
  • Fil- og socket-IO, trådparkeringer og unntak.

Hver hendelse har et tidsstempel, en varighet og et stackspor.

Egendefinerte hendelser

Du kan definere egne JFR-hendelser for å måle tid brukt på forretningslogikk. Utvid jdk.jfr.Event, annoter den, og kall deretter begin() / commit() rundt arbeidet.

Dette er den delen av JFR-API-et som fungerer uten ekstra avhengigheter. Et faktisk opptak krever fortsatt JVM-flaggene, men hendelsesklassen kompileres og kjører på alle JDK-er.

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 opptak

For tjenester som kjører lenge, kan du kjøre et kontinuerlig opptak med en begrenset størrelse eller alder (en ringbuffer).

Gamle hendelser forkastes når nye kommer til, slik at diskbruken holder seg begrenset. Når en hendelse oppstår, dumper du bufferen og har umiddelbart minuttene som ledet fram til den.

Dumpe ved avslutning

Legg til dumponexit=true i et start-flight-recording-flagg, så skriver JFR bufferen når JVM-en avsluttes.

Kombiner med -XX:FlightRecorderOptions for å konfigurere bufferstørrelsen. Dette sikrer at du fanger opp data selv fra en prosess som er i ferd med å avsluttes.

Lese filen

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

Kommandolinjen jfr print app.jfr kan også skrive ut hendelser som tekst for raskt grep-søk.

Strømme hendelser i sanntid

Siden JDK 14 støtter JFR hendelsesstrømming via jdk.jfr.consumer.RecordingStream-API-et.

I stedet for å dumpe en fil og åpne den senere abonnerer du på hendelser etter hvert som de skjer, og reagerer i sanntid — for eksempel ved å varsle når GC-pauser overskrider en terskel. Dermed blir JFR en kilde til sanntidsovervåking, ikke bare et verktøy for etteranalyse.

Hurtigsjekk

Hva er hovedgrunnen til at JFR kan kjøre kontinuerlig i produksjon?

Oppsummering

JFR er JVM-ens innebygde flydataopptaker:

  • Hendelsesinnsamling med lav overhead, trygg for produksjon, til .jfr-filer.
  • Start via -XX:StartFlightRecording eller jcmd JFR.start.
  • Velg innstillingene default eller profile, og definer egendefinerte hendelser.
  • Bruk kontinuerlige opptak med ringbuffer og dumponexit.
  • Analyser i JDK Mission Control i neste leksjon.
Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Java Flight Recorder» gratis?

Ja – hele teksten i «Java Flight Recorder» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Java Flight Recorder»?

Profilering med lav belastning Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Java Flight Recorder»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Identifisere flaskehalser
  2. Java Flight Recorder
  3. Analysere med JDK Mission Control
  4. Vanlige JVM-innstillinger
← Tilbake til Java Academy