Zachytenie výpisu vlákna Java

1. Prehľad

V tomto výučbe sa budeme zaoberať rôznymi spôsobmi, ako zachytiť výpis vlákien aplikácie Java.

Výpis vlákna je snímka stavu všetkých vlákien procesu Java. Stav každého vlákna je uvedený so sledovaním zásobníka, ktorý zobrazuje obsah zásobníka vlákna. Výpis vlákna je užitočný na diagnostiku problémov, pretože zobrazuje aktivitu vlákna. Skoky vlákien sú napísané ako obyčajný text, takže môžeme ich obsah uložiť do súboru a pozrieť sa na ne neskôr v textovom editore.

V ďalších častiach si prejdeme niekoľko nástrojov a prístupov na vygenerovanie výpisu vlákien.

2. Používanie obslužných programov JDK

JDK poskytuje niekoľko nástrojov, ktoré dokážu zachytiť výpis vlákien aplikácie Java. Všetky inžinierske siete sú umiestnené pod kôš priečinok vo vnútri domovského adresára JDK. Preto môžeme tieto pomocné programy spúšťať z príkazového riadku, pokiaľ je tento adresár v našej systémovej ceste.

2.1. jstack

jstack je nástroj JDK príkazového riadku, ktorý môžeme použiť na zachytenie výpisu vlákna. Trvá to pid procesu a zobrazí výpis vlákna v konzole. Prípadne môžeme jeho výstup presmerovať do súboru.

Pozrime sa na základnú syntax príkazu na zachytenie výpisu vlákna pomocou jstack:

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

Všetky vlajky sú voliteľné. Pozrime sa, čo znamenajú:

  • -F možnosť vynúti výpis vlákna; užitočné použiť, keď jstack pid nereaguje (proces je zablokovaný)
  • -l voľba dá príkazu obslužnému programu, aby hľadal prispôsobiteľné synchronizátory v halde a zámkoch
  • -m možnosť tlačí okrem rámcov zásobníka Java aj natívne rámce zásobníka (C a C ++)

Poďme tieto znalosti využiť, keď zachytíme výpis vlákna a presmerujeme výsledok do súboru:

jstack 17264> /tmp/threaddump.txt

Pamätajte, že môžeme ľahko získať pid procesu Java pomocou jps príkaz.

2.2. Java Mission Control

Java Mission Control (JMC) je nástroj GUI, ktorý zhromažďuje a analyzuje údaje z aplikácií Java. Po spustení JMC sa zobrazí zoznam procesov Java spustených na lokálnom počítači. Môžeme sa tiež pripojiť k vzdialeným procesom Java prostredníctvom JMC.

Môžeme kliknúť pravým tlačidlom myši na proces a kliknúť na „Spustite záznam letu”Možnosť. Po tomto Nite Záložka zobrazuje skládky vlákien:

2.3. jvisualvm

jvisualvm je nástroj s grafickým užívateľským rozhraním, ktorý nám umožňuje monitorovať, odstraňovať problémy a profilovať Java aplikácie. GUI je jednoduché, ale veľmi intuitívne a ľahko použiteľné.

Jedna z mnohých možností nám umožňuje zachytiť výpis vlákna. Ak klikneme pravým tlačidlom myši na proces Java a vyberieme „Výpis vlákna“ nástroj vytvorí výpis vlákna a otvorí ho na novej karte:

Od verzie JDK 9 nie je Visual VM súčasťou distribúcií Oracle JDK a Open JDK. Preto, ak používame Java 9 alebo novšie verzie, môžeme JVisualVM získať z webovej stránky projektu Visual VM open source.

2.4. jcmd

jcmd je nástroj, ktorý funguje tak, že odosiela požiadavky na príkazy do JVM. Aj keď je to mocné neobsahuje žiadne vzdialené funkcie - musíme ho použiť na rovnakom stroji, na ktorom je spustený proces Java.

Jedným z mnohých príkazov je Thread.print. Môžeme ho použiť na získanie výpisu vlákna iba zadaním pid procesu:

jcmd 17264 Thread.print

2.5. jconsole

jconsole nám umožňuje skontrolovať trasovanie zásobníka každého vlákna. Ak otvoríme jconsole a pripojiť sa k spustenému procesu Java, môžeme prejsť na Nite kartu a nájdite trasovanie zásobníka každého vlákna:

2.6. Zhrnutie

Ako sa ukázalo, existuje veľa spôsobov, ako zachytiť výpis vlákien pomocou obslužných programov JDK. Poďme sa na chvíľu nad každým zamyslieť a načrtnúť jeho klady a zápory:

  • jstack: poskytuje najrýchlejší a najjednoduchší spôsob zachytenia výpisu vlákna. Počnúc jazykom Java 8 sú však k dispozícii lepšie alternatívy
  • jmc: vylepšený nástroj na profilovanie a diagnostiku JDK. Minimalizuje réžiu výkonu, ktorá je zvyčajne problémom profilovacích nástrojov
  • jvisualvm: ľahký nástroj na profilovanie otvoreného zdroja s vynikajúcou konzolou GUI
  • jcmd: mimoriadne výkonný a odporúčaný pre verziu Java 8 a novšiu. Jediný nástroj, ktorý slúži na rôzne účely - zachytávanie výpisu vlákien (jstack), skládka haldy (jmap), vlastnosti systému a argumenty príkazového riadku (jinfo)
  • jconsole: poďme skontrolovať informácie o sledovaní zásobníka vlákien

3. Z príkazového riadku

Na podnikových aplikačných serveroch je z bezpečnostných dôvodov nainštalované iba JRE. Vyššie uvedené pomôcky teda nemôžeme použiť, pretože sú súčasťou JDK. Existujú však rôzne alternatívy príkazového riadku, ktoré nám umožňujú ľahko zachytiť skládky vlákien.

3.1. zabiť -3 Príkaz (Linux / Unix)

Najjednoduchší spôsob, ako zachytiť výpis vlákien v systémoch podobných Unixu, je cez zabiť príkaz, ktorým môžeme poslať signál do procesu pomocou príkazu zabiť () systémové volanie. V tomto prípade použitia mu pošleme -3 signál.

Pomocou našich rovnakých pid z predchádzajúcich príkladov sa pozrime na to, ako sa majú používať zabiť zachytiť výpis vlákna:

zabiť -3 17264

Týmto spôsobom bude proces Java prijímajúci signál tlačiť výpis vlákna na štandardný výstup.

Ak spustíme proces Java s nasledujúcou kombináciou ladiacich príznakov, potom bude tiež presmerovaný výpis vlákna na daný súbor:

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

Teraz, keď pošleme -3 signálu, okrem štandardného výstupu bude výpis k dispozícii na ~ / jvm.log spis.

3.2. Ctrl + Break (Windows)

V operačných systémoch Windows môžeme zachytiť výpis vlákien pomocou CTRL a Prestávka kombinácia klávesov. Ak chcete vykonať výpis vlákien, prejdite na konzolu, ktorá slúži na spustenie aplikácie Java, a stlačte CTRL a Prestávka kľúče spolu.

Stojí za zmienku, že na niektorých klávesniciach Prestávka kľúč nie je k dispozícii. Preto v takýchto prípadoch možno výpis vlákna zachytiť pomocou CTRL, POSUNa Pauza kľúče spolu.

Oba tieto príkazy vytlačia výpis vlákna do konzoly.

4. Programové použitie ThreadMxBean

Posledným prístupom, ktorý si v článku rozoberieme, je použitie JMX. Použijeme ThreadMxBean zachytiť výpis vlákna. Pozrime sa na to v kóde:

private static String threadDump (boolean lockedMonitors, boolean lockedSynchronizers) {StringBuffer threadDump = new StringBuffer (System.lineSeparator ()); ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean (); pre (ThreadInfo threadInfo: threadMXBean.dumpAllThreads (zamknutéMonitory, zamknutéSynchronizátory)) {threadDump.append (threadInfo.toString ()); } návrat threadDump.toString (); }

Vo vyššie uvedenom programe vykonávame niekoľko krokov:

  1. Najskôr prázdno StringBuffer je inicializovaný na uchovanie informácií o zásobníku každého vlákna.
  2. Potom použijeme ManagementFactory triedy na získanie inštancie ThreadMxBean. A ManagementFactory je továrenská trieda na získavanie spravovaných fazúľ pre platformu Java. Okrem toho a ThreadMxBean je rozhranie pre správu pre systém vlákien JVM.
  3. Nastavenie uzamknuté monitory a lockedSynchronizers hodnoty do pravda označuje zachytenie prispôsobiteľných synchronizátorov a všetkých uzamknutých monitorov na výpise vlákien.

5. Záver

V tomto článku sme si ukázali niekoľko spôsobov, ako zachytiť výpis vlákna.

Najskôr sme diskutovali o rôznych pomôckach JDK a potom o alternatívach príkazového riadku. V poslednej časti sme ukončili programový prístup využívajúci JMX.

Celý zdrojový kód príkladu je ako vždy k dispozícii na serveri GitHub.


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