Snimanje odlagališta niti Java

1. Pregled

U ovom uputstvu razgovarat ćemo o raznim načinima za hvatanje odlagališta niti Java aplikacije.

Dump izvoda je snimka stanja svih niti Java procesa. Stanje svake niti predstavljeno je tragom stoga, koji prikazuje sadržaj stoga niza. Dumpiranje niti korisno je za dijagnosticiranje problema jer prikazuje aktivnost niti. Odlagališta niti napisana su u običnom tekstu, tako da njihov sadržaj možemo spremiti u datoteku i pogledati ih kasnije u uređivaču teksta.

U sljedećim odjeljcima proći ćemo kroz više alata i pristupa za generiranje dump-a niti.

2. Korištenje uslužnih programa JDK

JDK nudi nekoliko uslužnih programa koji mogu uhvatiti dump niti Java aplikacije. Sve komunalne usluge smještene su pod kanta za smeće mapa unutar početnog direktorija JDK. Stoga ove uslužne programe možemo izvršavati iz naredbenog retka sve dok je ovaj direktorij na našem putu sustava.

2.1. jstack

jstack je uslužni program JDK naredbenog retka koji možemo koristiti za hvatanje izvatka niti. Potrebno je pid procesa i prikazuje dump niti u konzoli. Njegov izlaz možemo preusmjeriti u datoteku.

Pogledajmo osnovnu sintaksu naredbe za hvatanje dump-a niti pomoću jstacka:

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

Sve zastave nisu obavezne. Pogledajmo što znače:

  • -F opcija prisiljava izbacivanje niti; zgodan za upotrebu kada jstack pid ne reagira (postupak je prekinut)
  • -l opcija upućuje uslužni program da traži gomilu sinkronizatora u hrpi i bravama
  • -m opcija ispisuje okvire matičnog stoga (C i C ++) uz okvire Java stoga

Primijenimo ovo znanje hvatanjem dump-a niti i preusmjeravanjem rezultata u datoteku:

jstack 17264> /tmp/threaddump.txt

Zapamtite da možemo lako dobiti pid Java procesa pomoću jps naredba.

2.2. Java kontrola misije

Java Mission Control (JMC) je GUI alat koji prikuplja i analizira podatke iz Java aplikacija. Nakon što pokrenemo JMC, on prikazuje popis Java procesa koji se izvode na lokalnom računalu. Također se možemo povezati s udaljenim Java procesima putem JMC-a.

Desnim klikom možemo kliknuti postupak i kliknuti na "Pokrenite snimanje letaOpcija. Nakon ovoga, Niti Kartica prikazuje odlagališta niti:

2.3. jvisualvm

jvisualvm je alat s grafičkim korisničkim sučeljem koji nam omogućuje nadgledanje, rješavanje problema i profiliranje Java aplikacija. GUI je jednostavan, ali vrlo intuitivan i lak za upotrebu.

Jedna od mnogih mogućnosti omogućuje nam snimanje odlagališta niti. Ako desnom tipkom miša kliknemo na Java proces i odaberemo "Izbacivanje niti" opcija, alat će stvoriti dump niti i otvoriti ga u novoj kartici:

Od JDK 9, Visual VM nije uključen u distribucije Oracle JDK i Open JDK. Stoga, ako koristimo Javu 9 ili noviju verziju, JVisualVM možemo dobiti s projektnog web mjesta Visual VM.

2.4. jcmd

jcmd je alat koji radi slanjem zahtjeva za naredbe JVM-u. Iako moćan, to ne sadrži nikakve daljinske funkcije - moramo ga koristiti na istom stroju na kojem je pokrenut Java proces.

Jedna od mnogih naredbi je Navoj.tisak. Pomoću nje možemo dobiti dump niti samo specificiranjem pid procesa:

jcmd 17264 Navoj.tisak

2.5. jconsole

jconsole omogućuje nam pregled traga sloga svake niti. Ako otvorimo jconsole i povezati se s pokrenutim Java procesom, možemo doći do Niti tab i pronađite trag steka svake niti:

2.6. Sažetak

Ispostavilo se da postoji mnogo načina za hvatanje odlagališta niti pomoću JDK uslužnih programa. Uzmimo trenutak da razmislimo o svakoj i iznesemo njihove prednosti i nedostatke:

  • jstack: pruža najbrži i najlakši način za hvatanje odlagališta niti. Međutim, dostupne su bolje alternative počevši od Jave 8
  • jmc: poboljšani alat za JDK profiliranje i dijagnostiku. Smanjuje općenite performanse, što je obično problem s alatima za profiliranje
  • jvisualvm: lagan i alat za profiliranje otvorenog koda s izvrsnom GUI konzolom
  • jcmd: izuzetno moćan i preporučuje se za Javu 8 i novije verzije. Jedan alat koji služi u mnoge svrhe - hvatanje odlaganja konca (jstack), odlagalište hrpe (jmap), svojstva sustava i argumenti naredbenog retka (jinfo)
  • jconsole: pregledajmo podatke o tragovima niza nizova

3. Iz naredbenog retka

Na poslovnim poslužiteljima aplikacija samo je JRE instaliran iz sigurnosnih razloga. Dakle, ne možemo koristiti gore spomenute uslužne programe jer su oni dio JDK. Međutim, postoje razne alternative naredbenog retka koje nam omogućuju lako snimanje odlagališta niti.

3.1. ubiti -3 naredba (Linux / Unix)

Najjednostavniji način za hvatanje odlagališta niti u sustavima sličnim Unixu je putem ubiti naredba, pomoću koje možemo poslati signal procesu pomoću ubiti() sistemski poziv. U ovom ćemo slučaju poslati -3 signal.

Koristeći naše iste pid iz ranijih primjera, pogledajmo kako se koristiti ubiti za hvatanje izvatka niti:

ubiti -3 17264

Na taj će način Java-prijamni postupak ispisati dump niti na standardni izlaz.

Ako pokrenemo Java proces sa sljedećom kombinacijom ugađanja zastavica, tada će i preusmjeriti dump niti u zadanu datoteku:

-XX: + OtključajDijagnostičkeVMOptions -XX: + LogVMOutput -XX: LogFile = ~ / jvm.log

Sad, ako pošaljemo -3 signal, uz standardni izlaz, odlagalište će biti dostupno na ~ / jvm.log datoteka.

3.2. Ctrl + Break (Windows)

U operacijskim sustavima Windows možemo izuzeti odvod niti pomoću CTRL i Pauza kombinacija tipki. Da biste napravili dump niti, dođite do konzole koja se koristi za pokretanje Java programa i pritisnite CTRL i Pauza tipke zajedno.

Vrijedno je napomenuti da je na nekim tipkovnicama Pauza tipka nije dostupna. Stoga se u takvim slučajevima može izuzeti odvojak niti pomoću CTRL, SHIFT, i Pauza tipke zajedno.

Obje ove naredbe ispisuju dump niti na konzolu.

4. Programsko korištenje ThreadMxBean

Posljednji pristup o kojem ćemo raspravljati u članku je korištenje JMX-a. Koristit ćemo ThreadMxBean da uhvati odlagalište niti. Pogledajmo u kodu:

privatni statički String threadDump (logički lockedMonitors, boolean lockedSynchronizers) {StringBuffer threadDump = novi StringBuffer (System.lineSeparator ()); ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean (); za (ThreadInfo threadInfo: threadMXBean.dumpAllThreads (lockedMonitors, lockedSynchronizers)) {threadDump.append (threadInfo.toString ()); } return threadDump.toString (); }

U gornjem programu izvodimo nekoliko koraka:

  1. Isprva prazno StringBuffer inicijalizira se da zadrži informacije o hrpi svake niti.
  2. Zatim koristimo Tvornica upravljanja klasa za dobivanje instance ThreadMxBean. A Tvornica upravljanja je tvornička klasa za dobivanje upravljanog graha za Java platformu. Uz to, a ThreadMxBean je upravljačko sučelje za sustav niti JVM-a.
  3. Postavljanje zaključaniMonitori i zaključaniSinkronizatori vrijednosti do pravi označava hvatanje sinkronizatora koji se mogu posjedovati i svih zaključanih monitora na dumpu niti.

5. Zaključak

U ovom smo članku prikazali više načina za hvatanje odlagališta niti.

Isprva smo razgovarali o raznim uslužnim programima JDK, a zatim o alternativama naredbenog retka. U posljednjem smo dijelu zaključili s programskim pristupom koji koristi JMX.

Kao i uvijek, puni izvorni kod primjera dostupan je na GitHub-u.