Java Flight Recorder
Profilering med låg overhead.
Java Flight Recorder är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.
Vad är JFR?
Java Flight Recorder (JFR) är en motor för profilering och händelseinsamling som är inbyggd direkt i JVM.
Den registrerar detaljerade händelser under körning — metodsampling, allokeringar, GC, lås och I/O — i en binär .jfr-fil med mycket låg overhead. Den följer med JDK; ingen extra agent behövs.
Varför låg overhead spelar roll
Traditionella instrumenterande profilerare kan göra en app minst dubbelt så långsam och därmed förvränga just de tidsmätningar Ni vill undersöka.
JFR är utformat för att köras i produktion, vanligtvis med omkring 1 % overhead. Det innebär att Ni kan låta det vara aktiverat och fånga en inspelning när en verklig incident inträffar, inte bara i ett testlaboratorium.
Starta en inspelning vid uppstart
Aktivera JFR med en JVM-flagga när Ni startar applikationen:
-XX:StartFlightRecording=duration=60s,filename=app.jfr
Detta registrerar händelser under 60 sekunder och skriver dem sedan till app.jfr. Ni kan också starta en inspelning som fortsätter tills JVM avslutas.
Styra med jcmd
Ni kan också starta, stoppa och dumpa inspelningar i en JVM som redan körs med hjälp av jcmd:
jcmd <pid> JFR.start name=rec settings=profilejcmd <pid> JFR.dump name=rec filename=out.jfrjcmd <pid> JFR.stop name=rec
Detta är idealiskt när Ni vill ta en ögonblicksbild från en process som redan beter sig felaktigt.
Inställningar: default kontra profile
JFR levereras med två inbyggda konfigurationer:
- default — minimal overhead, säkert för kontinuerlig användning i produktion.
- profile — mer detaljerad sampling och något högre kostnad, för fokuserade undersökningar.
Välj med settings=profile. Ni kan också skriva en anpassad .jfc-konfiguration för att finjustera enskilda händelser.
Vad JFR registrerar
JFR fångar en omfattande uppsättning händelser, bland annat:
- Exekveringssampling — var CPU-tiden används.
- Objektallokering och TLAB-aktivitet.
- Pausar för garbage collection.
- Låskonkurrens (
jdk.JavaMonitorWait). - Fil- och socket-I/O, trådparkeringar och undantag.
Varje händelse har en tidsstämpel, en varaktighet och ett stackspår.
Egna händelser
Ni kan definiera egna JFR-händelser för att mäta tidsåtgången i affärslogik. Utöka jdk.jfr.Event, förse klassen med annoteringar och anropa sedan begin() och commit() runt arbetet.
Detta är den del av JFR:s API som fungerar fristående. En riktig inspelning kräver fortfarande JVM-flaggorna, men händelseklassen kompileras och körs på valfritt 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 inspelning
För långlivade tjänster kan Ni köra en kontinuerlig inspelning med en begränsad storlek eller ålder — en ringbuffert.
Gamla händelser tas bort när nya tillkommer, så diskutrymmet förblir begränsat. När en incident inträffar dumpar Ni bufferten och har omedelbart tillgång till minuterna som ledde fram till den.
Spara vid avslut
Lägg till dumponexit=true i en start-flight-recording-flagga, så skriver JFR bufferten när JVM avslutas.
Kombinera med -XX:FlightRecorderOptions för att ange buffertstorlek. Då garanteras att Ni fångar data även från en process som är på väg att avslutas.
Läsa filen
En .jfr-fil är binär. Ni analyserar den visuellt i JDK Mission Control (i nästa lektion), eller programmatiskt med API:t jdk.jfr.consumer och RecordingFile.
Kommandoraden jfr print app.jfr kan också skriva ut händelser som text för snabb sökning med grep.
Strömma händelser live
Sedan JDK 14 stöder JFR händelseströmning via API:t jdk.jfr.consumer.RecordingStream.
I stället för att dumpa en fil och öppna den senare prenumererar Ni på händelser medan de inträffar och reagerar i realtid — till exempel genom att skicka en avisering när GC-pauser överskrider ett tröskelvärde. Då blir JFR en källa för liveövervakning, inte bara ett verktyg för efteranalys.
Snabb kontroll
Vad är det främsta skälet till att JFR kan köras kontinuerligt i produktion?
Sammanfattning
JFR är JVM:s inbyggda färd-data-inspelare:
- Händelseinsamling med låg overhead, säker för produktion, till
.jfr-filer. - Starta via
-XX:StartFlightRecordingellerjcmd JFR.start. - Välj inställningarna default eller profile och definiera egna händelser.
- Använd kontinuerlig inspelning med ringbuffert och
dumponexit. - Analysera inspelningen i JDK Mission Control i nästa steg.
Lär dig Java med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 104
- Lektioner
- 374
Vanliga frågor
Är lektionen ”Java Flight Recorder” gratis?
Ja – hela texten till ”Java Flight Recorder” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Java Flight Recorder”?
Profilering med låg overhead. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Java Academy?
Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Java Flight Recorder”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Java Academy-lektionen?
Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Identifiera flaskhalsar
- Java Flight Recorder
- Analysera med JDK Mission Control
- Vanliga JVM-flaggar för finjustering