Java Flight Recorder
Profilering med lav belastning
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=profilejcmd <pid> JFR.dump name=rec filename=out.jfrjcmd <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:StartFlightRecordingellerjcmd 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.
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
- Identifisere flaskehalser
- Java Flight Recorder
- Analysere med JDK Mission Control
- Vanlige JVM-innstillinger