Fange en Java Thread Dump

1. Oversikt

I denne opplæringen vil vi diskutere forskjellige måter å fange tråddumpen til et Java-program.

En tråddump er et øyeblikksbilde av tilstanden til alle trådene i en Java-prosess. Tilstanden til hver tråd er presentert med et stabelspor som viser innholdet i en tråds bunke. En tråddumping er nyttig for å diagnostisere problemer da den viser trådens aktivitet. Tråddumps skrives i ren tekst, slik at vi kan lagre innholdet i en fil og se på dem senere i en tekstredigerer.

I de neste avsnittene vil vi gå gjennom flere verktøy og tilnærminger for å generere en tråddumping.

2. Bruke JDK Utilities

JDK tilbyr flere verktøy som kan fange tråddumpen til et Java-program. Alle verktøyene ligger under søppel mappen i JDK-hjemmekatalogen. Derfor kan vi utføre disse verktøyene fra kommandolinjen så lenge denne katalogen er i systemstien vår.

2.1. jstack

jstack er et kommandolinj JDK-verktøy vi kan bruke til å fange en tråddump. Det tar pid av en prosess og viser tråddumpen i konsollen. Alternativt kan vi omdirigere utdataene til en fil.

La oss ta en titt på den grunnleggende kommandosyntaksen for å fange en tråddump ved hjelp av jstack:

jstack [-F] [-l] [-m] 

Alle flaggene er valgfrie. La oss se hva de mener:

  • -F alternativet tvinger en tråddumping; praktisk å bruke når jstack pid svarer ikke (prosessen er hengt)
  • -l alternativet instruerer verktøyet om å lete etter synkroniserbare enheter i bunken og låser
  • -m alternativ skriver ut native stack frames (C & C ++) i tillegg til Java stack frames

La oss bruke denne kunnskapen ved å fange en tråddump og omdirigere resultatet til en fil:

jstack 17264> /tmp/threaddump.txt

Husk at vi lett kan få pid av en Java-prosess ved hjelp av jps kommando.

2.2. Java Mission Control

Java Mission Control (JMC) er et GUI-verktøy som samler inn og analyserer data fra Java-applikasjoner. Etter at vi har startet JMC, viser den listen over Java-prosesser som kjører på en lokal maskin. Vi kan også koble til eksterne Java-prosesser via JMC.

Vi kan høyreklikke på prosessen og klikke på “Start flyopptak”Alternativet. Etter dette, Tråder fanen viser gjengedumpene:

2.3. jvisualvm

jvisualvm er et verktøy med et grafisk brukergrensesnitt som lar oss overvåke, feilsøke og profilere Java-applikasjoner. GUI er enkel, men veldig intuitiv og enkel å bruke.

En av de mange alternativene lar oss fange en tråddumping. Hvis vi høyreklikker på en Java-prosess og velger “Tråddump” alternativet, vil verktøyet opprette en tråddumping og åpne den i en ny fane:

Fra og med JDK 9 er ikke Visual VM inkludert i Oracle JDK og Open JDK-distribusjonene. Derfor, hvis vi bruker Java 9 eller nyere versjoner, kan vi få JVisualVM fra Visual VM open source-prosjektstedet.

2.4. jcmd

jcmd er et verktøy som fungerer ved å sende kommandoforespørsler til JVM. Selv om det er kraftig, er det inneholder ikke noen ekstern funksjonalitet - vi må bruke den på den samme maskinen der Java-prosessen kjører.

En av de mange kommandoene er Tråd.avtrykk. Vi kan bruke den til å få en tråddumping bare ved å spesifisere pid av prosessen:

jcmd 17264 Trådavtrykk

2.5. jconsole

jconsole lar oss inspisere stabelspor for hver tråd. Hvis vi åpner jconsole og koble til en pågående Java-prosess, vi kan navigere til Tråder kategorien, og finn stengesporene til hver tråd:

2.6. Sammendrag

Så det viser seg at det er mange måter å fange en tråddumping ved hjelp av JDK-verktøy. La oss ta et øyeblikk til å reflektere over hver og skissere fordeler og ulemper med dem:

  • jstack: gir den raskeste og enkleste måten å fange en tråddumping. Imidlertid er bedre alternativer tilgjengelig fra og med Java 8
  • jmc: forbedret JDK-profilerings- og diagnostikkverktøy. Det minimerer ytelsen overhead som vanligvis er et problem med profileringsverktøy
  • jvisualvm: Lett og åpen kildekode-profileringsverktøy med en utmerket GUI-konsoll
  • jcmd: ekstremt kraftig og anbefales for Java 8 og nyere. Et enkelt verktøy som tjener mange formål - å fange tråddumping (jstack), heap dump (jmap), systemegenskaper og kommandolinjeargumenter (jinfo)
  • jconsole: la oss inspisere trådsporingsinformasjon

3. Fra kommandolinjen

På bedriftsapplikasjonsservere er bare JRE installert av sikkerhetsmessige årsaker. Dermed kan vi ikke bruke de ovennevnte verktøyene ettersom de er en del av JDK. Det er imidlertid forskjellige kommandolinjealternativer som lar oss enkelt fange tråddumper.

3.1. drepe -3 Kommando (Linux / Unix)

Den enkleste måten å fange en tråddumping i Unix-lignende systemer er gjennom drepe kommando, som vi kan bruke til å sende et signal til en prosess ved hjelp av drepe() systemanrop. I dette tilfellet sender vi den -3 signal.

Bruker det samme pid fra tidligere eksempler, la oss ta en titt på hvordan du bruker drepe å fange en tråddump:

drepe -3 17264

På denne måten vil den signalmottakende Java-prosessen skrive ut tråddumpen på standardutgangen.

Hvis vi kjører Java-prosessen med følgende kombinasjon av innstillingsflagg, vil den også omdirigere tråddumpingen til den gitte filen:

-XX: + UnlockDiagnosticVMOptions -XX: + LogVMOutput -XX: LogFile = ~ / jvm.log

Nå hvis vi sender -3 , i tillegg til standardutgangen, vil dumpen være tilgjengelig på ~ / jvm.log fil.

3.2. Ctrl + Break (Windows)

I Windows-operativsystemer kan vi fange en tråddump ved hjelp av CTRL og Gå i stykker tastekombinasjon. For å ta en tråddumping, naviger til konsollen som ble brukt til å starte Java-applikasjonen og trykk CTRL og Gå i stykker nøklene sammen.

Det er verdt å merke seg at på noen tastaturer Gå i stykker nøkkelen er ikke tilgjengelig. Derfor, i slike tilfeller, kan en tråddump fanges opp ved hjelp av CTRL, SKIFTE, og Pause nøklene sammen.

Begge disse kommandoene skriver ut tråddumpingen til konsollen.

4. Programmatisk bruk ThreadMxBean

Den siste tilnærmingen vi vil diskutere i artikkelen bruker JMX. Vi bruker ThreadMxBean for å fange tråddumpen. La oss se det i kode:

privat statisk streng threadDump (boolsk låst overvåker, boolsk låst synkronisering) {StringBuffer threadDump = ny StringBuffer (System.lineSeparator ()); ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean (); for (ThreadInfo threadInfo: threadMXBean.dumpAllThreads (lockedMonitors, lockedSynchronizers)) {threadDump.append (threadInfo.toString ()); } returner threadDump.toString (); }

I programmet ovenfor utfører vi flere trinn:

  1. Først en tom StringBuffer er initialisert for å inneholde stabelinformasjonen til hver tråd.
  2. Vi bruker deretter ManagementFactory klasse for å få forekomsten av ThreadMxBean. EN ManagementFactory er en fabrikklasse for å få administrerte bønner til Java-plattformen. I tillegg vil en ThreadMxBean er administrasjonsgrensesnittet for trådsystemet til JVM.
  3. Omgivelser lockedMonitors og lockedSynchronizers verdier til ekte indikerer å fange de egne synkroniseringene og alle låste skjermer i tråddumpen.

5. Konklusjon

I denne artikkelen har vi vist flere måter å fange en tråddumping på.

Først diskuterte vi forskjellige JDK-verktøy og deretter kommandolinjealternativene. I den siste delen konkluderte vi med den programmatiske tilnærmingen ved bruk av JMX.

Som alltid er hele kildekoden til eksemplet tilgjengelig på GitHub.


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