Overvågning af Java-applikationer med Flight Recorder

1. Oversigt

I denne vejledning undersøger vi Java Flight Recorder, dens koncepter, dens grundlæggende kommandoer og hvordan man bruger den.

2. Java-overvågningsværktøjer

Java er ikke kun et programmeringssprog, men et meget rigt økosystem med mange værktøjer. JDK indeholder programmer, der giver os mulighed for at kompilere vores egne programmer samt overvåge deres tilstand og tilstanden på Java Virtual Machine i løbet af programudførelsens fulde livscyklus.

Det beholder mappe i en JDK-distribution indeholder blandt andet følgende programmer, der kan bruges til profilering og overvågning:

  • Java VisualVM (jvisualvm.exe)
  • JConsole (jconsole.exe)
  • Java Mission Control (jmc.exe)
  • Diagnostic Command Tool (jcmd.exe)

Vi foreslår at udforske indholdet af denne mappe for at være opmærksom på, hvilke værktøjer vi har til rådighed. Bemærk, at Java VisualVM tidligere var en del af Oracle og Open JDK-distributioner. Imidlertid, startende fra Java 9, leveres JDK-distributioner ikke længere med Java VisualVM. Derfor bør vi downloade det separat fra VisualVM open source-projektwebstedet.

I denne vejledning fokuserer vi på Java Flight Recorder. Dette er ikke til stede blandt ovennævnte værktøjer, fordi det ikke er et enkeltstående program. Dets anvendelse er tæt knyttet til to af ovenstående værktøjer - Java Mission Control og Diagnostic Command Tools.

3. Java Flight Recorder og dens grundlæggende koncepter

Java Flight Recorder (JFR) er et overvågningsværktøj, der indsamler oplysninger om begivenhederne i en Java Virtual Machine (JVM) under udførelsen af ​​en Java-applikation. JFR er en del af JDK-distributionen, og den er integreret i JVM.

JFR er designet til at påvirke ydeevnen for en kørende applikation så lidt som muligt.

For at bruge JFR skal vi aktivere det. Vi kan opnå dette på to måder:

  1. når du starter et Java-program
  2. videregive diagnostiske kommandoer af jcmd værktøj, når et Java-program allerede kører

JFR har ikke et enkeltstående værktøj. Vi bruger Java Mission Control (JMC), som indeholder et plugin, der giver os mulighed for at visualisere de data, der er indsamlet af JFR.

Disse tre komponenter - JFR, jcmd og JMC - danne en komplet pakke til indsamling af informationer om et lavt Java-runtime-program Vi kan finde disse oplysninger meget nyttige, når vi optimerer vores program, eller når vi diagnosticerer dem, når noget går galt.

Hvis vi har forskellige versioner af Java installeret på vores computer, er det vigtigt at sørg for, at Java-kompilatoren (javac), Java-launcheren (java) og de ovennævnte værktøjer (JFR, jcmd og JMC) er fra den samme Java-distribution. Ellers er der en risiko for ikke at kunne se nyttige data, fordi JFR-dataformaterne i forskellige versioner muligvis ikke er kompatible.

JFR har to hovedkoncepter: begivenheder og dataforløb. Lad os kort diskutere dem.

3.1. Begivenheder

JFR indsamler begivenheder, der opstår i JVM, når Java-applikationen kører. Disse begivenheder er relateret til JVM-tilstanden eller programmets tilstand. En begivenhed har et navn, et tidsstempel og yderligere oplysninger (som trådinformation, udførelsesstak og bunkenes tilstand).

Der er tre typer begivenheder at JFR indsamler:

  • en øjeblikkelig begivenhed logges straks, når det sker
  • en varighedsbegivenhed er logget, hvis varigheden overskrider en specificeret tærskel
  • en prøvebegivenhed bruges til at prøve systemaktiviteten

3.2. Dataflow

De begivenheder, som JFR indsamler, indeholder en enorm mængde data. Af denne grund er JFR efter design hurtig nok til ikke at hindre programmet.

JFR gemmer data om begivenhederne i en enkelt outputfil, flight.jfr.

Som vi ved, er disk I / O-operationer ret dyre. Derfor bruger JFR forskellige buffere til at gemme de indsamlede data, før de blokkerer dataene til disken. Ting kan blive lidt mere komplekse, fordi et program i samme øjeblik kan have flere registreringsprocesser med forskellige muligheder.

På grund af dette, vi kan muligvis finde flere data i outputfilen end anmodet om, eller de er muligvis ikke i kronologisk rækkefølge. Vi bemærker måske ikke engang denne kendsgerning, hvis vi bruger JMC, fordi det visualiserer begivenhederne i kronologisk rækkefølge.

I nogle sjældne tilfælde kan JFR muligvis ikke skylle dataene (for eksempel når der er for mange begivenheder eller i tilfælde af strømafbrydelse). Hvis dette sker, forsøger JFR at informere os om, at outputfilen muligvis mangler et stykke data.

4. Sådan bruges Java Flight Recorder

JFR er et eksperimentelt træk, og dets anvendelse kan derfor ændres. Faktisk er vi i tidligere distributioner nødt til at aktivere kommercielle funktioner for at kunne bruge det til produktion. Fra JDK 11 kan vi dog bruge det uden at aktivere noget. Vi kan altid se de officielle Java-udgivelsesnotater for at kontrollere, hvordan du bruger dette værktøj.

For at JDK 8 skal kunne aktivere JFR, skal vi starte JVM med indstillingerne + UnlockCommercialFeatures og + FlightRecorder.

Som vi har nævnt ovenfor, er der to måder at aktivere JFR på. Når vi aktiverer det samtidigt med at starte applikationen, gør vi det fra kommandolinjen. Når applikationen allerede kører, bruger vi diagnosekommandoværktøjet.

4.1. Kommandolinje

Først kompilerer vi programmets * .java fil til en * .klasse ved hjælp af standard Java-kompilatoren javac.

Når kompileringen lykkes, starter vi muligvis programmet med følgende muligheder:

java -XX: + UnlockCommercialFeatures -XX: + FlightRecorder -XX: StartFlightRecording = varighed = 200s, filnavn = flight.jfr sti-til-klasse-fil

hvor sti til klasse-fil er applikationens startpunkt * .klasse fil.

Denne kommando starter applikationen og aktiverer optagelsen, som starter med det samme og varer ikke mere end 200 sekunder. Samlede data gemmes i en outputfil, flight.jfr. Vi beskriver de andre muligheder mere detaljeret i det næste afsnit.

4.2. Diagnostic Command Tool

Vi kan også begynde at registrere begivenhederne ved hjælp af jcmd værktøj. For eksempel:

jcmd 1234 JFR.startvarighed = 100s filnavn = flight.jfr

Forud for JDK 11 skal vi starte applikationen med ulåste kommercielle funktioner for at kunne aktivere JFR på denne måde:

java -XX: + UnlockCommercialFeatures -XX: + FlightRecorder -cp ./out/ com.baeldung.Main

Når applikationen kører, bruger vi dens proces-id til at udføre forskellige kommandoer, som har følgende format:

jcmd [parametre]

Her er en komplet liste over diagnostiske kommandoer:

  • JFR.start - starter en ny JFR-optagelse
  • JFR. Kontrol - kontrollerer kørsel af JFR-optagelse
  • JFR. Stop - stopper en bestemt JFR-optagelse
  • JFR. Dump - kopierer indholdet af en JFR-optagelse til filen

Hver kommando har en række parametre. F.eks JFR.start kommandoen har følgende parametre:

  • navn - navnet på optagelsen det tjener til at kunne henvise til denne optagelse senere med andre kommandoer
  • forsinke - dimensionel parameter for en tidsforsinkelse af start af optagelse, standardværdien er 0s
  • varighed - dimensionel parameter for et tidsinterval af optagelsens varighed standardværdien er 0s, hvilket betyder ubegrænset
  • filnavn - navnet på en fil, der indeholder de indsamlede data
  • maks - dimensionel parameter for den maksimale alder for indsamlede data standardværdien er 0s, hvilket betyder ubegrænset
  • maks. størrelse - den maksimale størrelse af buffere til indsamlede data i byte standardværdien er 0, hvilket betyder ingen maks. størrelse

Vi har allerede set et eksempel på brugen af ​​disse parametre i begyndelsen af ​​dette afsnit. For at få en komplet liste over parametrene kan vi altid se den officielle Java Flight Recorded-dokumentation.

Selvom JFR er designet til at have så lidt et fodaftryk som muligt på JVM's og applikationens ydeevne, er det bedre at begrænse den maksimale mængde indsamlede data ved at indstille mindst en af ​​parametrene: varighed, maks, eller maks. størrelse.

5. Java Flight Recorder i aktion

Lad os nu demonstrere JFR i aktion ved hjælp af et eksempelprogram.

5.1. Eksempel på program

Vores program indsætter objekter i en liste, indtil en OutOfMemoryError opstår. Derefter sover programmet i et sekund:

public static void main (String [] args) {List items = new ArrayList (1); prøv {while (true) {items.add (nyt objekt ()); }} fange (OutOfMemoryError e) {System.out.println (e.getMessage ()); } hævde items.size ()> 0; prøv {Thread.sleep (1000); } fange (InterruptedException e) {System.out.println (e.getMessage ()); }}

Uden at udføre denne kode kan vi få øje på en potentiel ulempe: mens loop fører til høj CPU- og hukommelsesforbrug. Lad os bruge JFR til at se disse ulemper og sandsynligvis finde andre.

5.2. Start registrering

Først kompilerer vi vores program ved at udføre følgende kommando fra kommandolinjen:

javac -d ud -sourcepath src / main src / main / com / baeldung / flightrecorder / FlightRecorder.java

På dette tidspunkt skal vi finde en fil FlightRecorder.class i ud / com / baeldung / flightrecorder vejviser.

Nu starter vi programmet med følgende muligheder:

java -XX: + UnlockCommercialFeatures -XX: + FlightRecorder -XX: StartFlightRecording = varighed = 200s, filnavn = flight.jfr -cp ./out/ com.baeldung.flightrecorder.FlightRecorder

5.3. Visualiser data

Nu fodrer vi filen flight.jfr til Java Mission Control, som er en del af JDK-distributionen. Det hjælper os med at visualisere dataene om vores begivenheder på en pæn og intuitiv måde.

Dens hovedskærm viser os oplysningerne om, hvordan programmet brugte CPU'en under dens udførelse. Vi ser, at CPU'en blev belastet tungt, hvilket forventes meget på grund af mens løkke:

På venstre side af udsigten ser vi sektioner Generel, Hukommelse, Kodeog Tråde, blandt andre. Hver sektion indeholder forskellige faner med detaljeret information. For eksempel fane Varme metoder i sektion Kode indeholder statistikker over metodeopkald:

På denne fane kan vi se en anden ulempe ved vores eksempelprogram: metode java.util.ArrayList.grow (int) er blevet kaldt 17 gange for at forstørre array-kapaciteten hver gang der ikke var plads nok til at tilføje et objekt.

I mere realistiske programmer ser vi muligvis mange andre nyttige oplysninger:

  • statistik om oprettede objekter, når de blev oprettet og ødelagt af affaldssamleren
  • en detaljeret rapport om trådernes kronologi, når de var låst eller aktive
  • hvilke I / O-handlinger applikationen udførte

6. Konklusion

I denne artikel introducerede vi emnet overvågning og profilering af en Java-applikation ved hjælp af Java Flight Recorder. Dette værktøj er fortsat et eksperimentelt, så vi bør konsultere dets officielle websted for mere komplet og nyere information.

Som altid er kodestykket tilgængeligt på vores Github-lager.


$config[zx-auto] not found$config[zx-overlay] not found