Overvåking av Java-applikasjoner med Flight Recorder

1. Oversikt

I denne opplæringen vil vi undersøke Java Flight Recorder, dets konsepter, grunnleggende kommandoer og hvordan du bruker den.

2. Java Monitoring Utilities

Java er ikke bare et programmeringsspråk, men et veldig rikt økosystem med mange verktøy. JDK inneholder programmer som lar oss kompilere våre egne programmer, samt overvåke tilstanden og tilstanden til Java Virtual Machine i løpet av hele livssyklusen for programgjennomføring.

De søppel mappen til en JDK-distribusjon inneholder blant annet følgende programmer som kan brukes til profilering og overvåking:

  • Java VisualVM (jvisualvm.exe)
  • JConsole (jconsole.exe)
  • Java Mission Control (jmc.exe)
  • Diagnostisk kommandoverktøy (jcmd.exe)

Vi foreslår at du utforsker innholdet i denne mappen for å være klar over hvilke verktøy vi har til rådighet. Vær oppmerksom på at Java VisualVM tidligere var en del av Oracle og Open JDK-distribusjonene. Derimot, Fra Java 9 leveres ikke JDK-distribusjoner lenger med Java VisualVM. Derfor bør vi laste den ned separat fra nettstedet VisualVM open source project.

I denne opplæringen vil vi fokusere på Java Flight Recorder. Dette er ikke tilstede blant verktøyene nevnt ovenfor, fordi det ikke er et frittstående program. Bruken er nært knyttet til to av verktøyene ovenfor - Java Mission Control og Diagnostic Command Tools.

3. Java Flight Recorder og dens grunnleggende konsepter

Java Flight Recorder (JFR) er et overvåkingsverktøy som samler informasjon om hendelsene i en Java Virtual Machine (JVM) under kjøringen av et Java-program. JFR er en del av JDK-distribusjonen, og den er integrert i JVM.

JFR er designet for å påvirke ytelsen til et løpende program så lite som mulig.

For å bruke JFR, bør vi aktivere den. Vi kan oppnå dette på to måter:

  1. når du starter et Java-program
  2. overføring av diagnostiske kommandoer av jcmd verktøyet når et Java-program allerede kjører

JFR har ikke et frittstående verktøy. Vi bruker Java Mission Control (JMC), som inneholder et plugin som lar oss visualisere dataene som samles inn av JFR.

Disse tre komponentene - JFR, jcmd og JMC - danne en komplett pakke for å samle informasjon om kjøretidsnivå på et lavt Java-program. Vi kan finne denne informasjonen veldig nyttig når vi optimaliserer programmet vårt, eller når vi diagnostiserer det når noe går galt.

Hvis vi har forskjellige versjoner av Java installert på datamaskinen vår, er det viktig å sørg for at Java-kompilatoren (javac), Java-lanseringen (java) og de ovennevnte verktøyene (JFR, jcmd og JMC) er fra samme Java-distribusjon. Ellers er det en risiko for at du ikke kan se nyttige data fordi JFR-dataformatene i forskjellige versjoner kanskje ikke er kompatible.

JFR har to hovedkonsepter: hendelser og dataflyt. La oss diskutere dem kort.

3.1. arrangementer

JFR samler inn hendelser som oppstår i JVM når Java-applikasjonen kjører. Disse begivenhetene er relatert til tilstanden til selve JVM eller tilstanden til programmet. En hendelse har et navn, en tidsstempel og tilleggsinformasjon (som trådinformasjon, utførelsesstabel og haugens tilstand).

Det er tre typer arrangementer at JFR samler inn:

  • en øyeblikkelig begivenhet logges umiddelbart når den oppstår
  • en varighetsbegivenhet logges hvis varigheten når en spesifisert terskel
  • en prøvehendelse brukes til å prøve systemaktiviteten

3.2. Dataflyt

Hendelsene som JFR samler inn inneholder enorme mengder data. Av denne grunn, etter design, er JFR rask nok til ikke å hindre programmet.

JFR lagrer data om hendelsene i en enkelt utdatafil, flight.jfr.

Som vi vet er disk I / O-operasjoner ganske dyre. Derfor bruker JFR forskjellige buffere for å lagre de innsamlede dataene før de skyller datablokkene til disken. Ting kan bli litt mer komplekse fordi et program i samme øyeblikk kan ha flere registreringsprosesser med forskjellige alternativer.

På grunn av dette, Det kan hende at vi finner mer data i utdatafilen enn forespurt, eller det er ikke i kronologisk rekkefølge. Vi legger kanskje ikke en gang merke til dette faktum hvis vi bruker JMC, fordi det visualiserer hendelsene i kronologisk rekkefølge.

I noen sjeldne tilfeller kan JFR ikke spyle dataene (for eksempel når det er for mange hendelser eller i tilfelle strømbrudd). Hvis dette skjer, prøver JFR å informere oss om at utdatafilen kan mangle et stykke data.

4. Hvordan bruke Java Flight Recorder

JFR er en eksperimentell funksjon, og bruken kan derfor endres. I tidligere distribusjoner må vi faktisk aktivere kommersielle funksjoner for å kunne bruke den i produksjonen. Fra og med JDK 11 kan vi imidlertid bruke den uten å aktivere noe. Vi kan alltid se de offisielle Java-utgivelsesnotatene for å sjekke hvordan du bruker dette verktøyet.

For at JDK 8 skal kunne aktivere JFR, bør vi starte JVM med alternativene + Lås oppKommersielle funksjoner og + FlightRecorder.

Som vi har nevnt ovenfor, er det to måter å aktivere JFR på. Når vi aktiverer det samtidig med å starte applikasjonen, gjør vi det fra kommandolinjen. Når applikasjonen allerede kjører, bruker vi diagnostisk kommandoverktøy.

4.1. Kommandolinje

Først kompilerer vi programmets * .java fil til en *.klasse ved hjelp av standard Java-kompilatoren javac.

Når samlingen lykkes, kan vi starte programmet med følgende alternativer:

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

hvor vei til klasse-fil er applikasjonens inngangspunkt *.klasse fil.

Denne kommandoen starter applikasjonen og aktiverer opptaket, som starter umiddelbart og varer ikke mer enn 200 sekunder. Samlede data lagres i en utdatafil, flight.jfr. Vi beskriver de andre alternativene mer detaljert i neste avsnitt.

4.2. Diagnostisk kommandoverktøy

Vi kan også begynne å registrere hendelsene ved å bruke jcmd verktøy. For eksempel:

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

Før JDK 11, for å kunne aktivere JFR på denne måten, bør vi starte applikasjonen med ulåste kommersielle funksjoner:

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

Når applikasjonen kjører, bruker vi prosess-ID-en for å utføre forskjellige kommandoer, som har følgende format:

jcmd [parametere]

Her er en komplett liste over diagnostiske kommandoer:

  • JFR.start - starter et nytt JFR-opptak
  • JFR. Sjekk - sjekker kjøring av JFR-opptak
  • JFR. Stopp - stopper et spesifikt JFR-opptak
  • JFR. Dump - kopierer innholdet av et JFR-opptak til filen

Hver kommando har en rekke parametere. For eksempel JFR.start kommandoen har følgende parametere:

  • Navn - navnet på opptaket; det tjener til å kunne referere til dette opptaket senere med andre kommandoer
  • forsinkelse - dimensjonal parameter for en tidsforsinkelse av opptakets start, standardverdien er 0s
  • varighet - dimensjonal parameter for et tidsintervall for opptakets varighet; standardverdien er 0s, noe som betyr ubegrenset
  • filnavn - navnet på en fil som inneholder de innsamlede dataene
  • maksimum - dimensjonal parameter for maksimal alder på innsamlede data; standardverdien er 0s, noe som betyr ubegrenset
  • maks størrelse - maksimal størrelse på buffere for samlet data i byte; standardverdien er 0, noe som betyr ingen maks størrelse

Vi har allerede sett et eksempel på bruken av disse parametrene i begynnelsen av denne delen. For en fullstendig liste over parametrene, kan vi alltid konsultere den offisielle dokumentasjonen for Java Flight Recorded.

Selv om JFR er designet for å ha så lite fotavtrykk som mulig av ytelsen til JVM og applikasjonen, er det bedre å begrense den maksimale mengden innsamlede data ved å angi minst en av parametrene: varighet, maksimum, eller maks størrelse.

5. Java Flight Recorder i aksjon

La oss nå demonstrere JFR i aksjon ved hjelp av et eksempelprogram.

5.1. Eksempel på program

Programmet vårt setter inn objekter i en liste til en OutOfMemoryError inntreffer. Deretter sover programmet i ett sekund:

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

Uten å utføre denne koden, kan vi oppdage en potensiell ulempe: samtidig som loop vil føre til høy CPU- og minnebruk. La oss bruke JFR til å se disse ulempene og sannsynligvis finne andre.

5.2. Begynn å registrere deg

Først kompilerer vi programmet vårt ved å utføre følgende kommando fra kommandolinjen:

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

På dette tidspunktet bør vi finne en fil FlightRecorder.class i ut / com / baeldung / flightrecorder katalog.

Nå starter vi programmet med følgende alternativer:

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

5.3. Visualiser data

Nå mater vi filen flight.jfr til Java Mission Control, som er en del av JDK-distribusjonen. Det hjelper oss å visualisere dataene om hendelsene våre på en fin og intuitiv måte.

Hovedskjermen viser oss informasjon om hvordan programmet brukte CPU-en under utførelsen. Vi ser at CPU var tungt lastet, noe som er ganske forventet på grunn av samtidig som Løkke:

På venstre side av utsikten ser vi seksjoner Generell, Hukommelse, Kode, og Tråder, blant andre. Hver seksjon inneholder forskjellige faner med detaljert informasjon. For eksempel fanen Varme metoder av seksjonen Kode inneholder statistikken over metodeanrop:

I denne kategorien kan vi oppdage en annen ulempe ved vårt eksempelprogram: metode java.util.ArrayList.grow (int) har blitt kalt 17 ganger for å forstørre matrisekapasiteten hver gang det ikke var nok plass til å legge til et objekt.

I mer realistiske programmer kan vi se mye annen nyttig informasjon:

  • statistikk om skapte gjenstander, når de ble opprettet og ødelagt av søppeloppsamleren
  • en detaljert rapport om trådenes kronologi når de var låst eller aktive
  • hvilke I / O-operasjoner applikasjonen utførte

6. Konklusjon

I denne artikkelen introduserte vi temaet overvåking og profilering av et Java-program ved hjelp av Java Flight Recorder. Dette verktøyet er fortsatt et eksperimentelt, så vi bør konsultere det offisielle nettstedet for mer fullstendig og nylig informasjon.

Som alltid er kodebiten tilgjengelig på Github-depotet vårt.


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