Monitorovanie Java aplikácií pomocou Flight Recorder

1. Prehľad

V tomto výučbe sa pozrieme na Java Flight Recorder, jeho koncepcie, základné príkazy a spôsob jeho používania.

2. Pomôcky na monitorovanie Java

Java nie je len programovací jazyk, ale veľmi bohatý ekosystém s množstvom nástrojov. JDK obsahuje programy, ktoré nám umožňujú zostavovať naše vlastné programy, ako aj monitorovať ich stav a stav Java Virtual Machine počas celého životného cyklu vykonávania programu.

The kôš priečinok distribúcie JDK obsahuje okrem iných aj nasledujúce programy, ktoré možno použiť na profilovanie a monitorovanie:

  • Java VisualVM (jvisualvm.exe)
  • JConsole (jconsole.exe)
  • Java Mission Control (jmc.exe)
  • Diagnostický príkazový nástroj (jcmd.exe)

Navrhujeme preskúmať obsah tohto priečinka, aby ste si boli vedomí, aké nástroje máme k dispozícii. Upozorňujeme, že Java VisualVM bola v minulosti súčasťou distribúcií Oracle a Open JDK. Avšak počnúc jazykom Java 9 sa distribúcie JDK už nedodávajú s jazykom Java VisualVM. Preto by sme si ho mali stiahnuť osobitne z webovej stránky projektu open source projektu VisualVM.

V tejto príručke sa zameriame na Java Flight Recorder. Toto nie je prítomné medzi vyššie spomenutými nástrojmi, pretože nejde o samostatný program. Jeho použitie úzko súvisí s dvoma vyššie uvedenými nástrojmi - Java Mission Control a Diagnostic Command Tools.

3. Java Flight Recorder a jeho základné koncepty

Java Flight Recorder (JFR) je monitorovací nástroj, ktorý zhromažďuje informácie o udalostiach v prostredí Java Virtual Machine (JVM) počas vykonávania aplikácie Java. JFR je súčasťou distribúcie JDK a je integrovaný do JVM.

JFR je navrhnuté tak, aby čo najmenej ovplyvňovali výkon spustenej aplikácie.

Aby sme mohli používať JFR, mali by sme si ho aktivovať. Môžeme to dosiahnuť dvoma spôsobmi:

  1. pri spustení aplikácie Java
  2. odovzdávanie diagnostických príkazov z jcmd nástroj, keď je už spustená aplikácia Java

JFR nemá samostatný nástroj. Používame program Java Mission Control (JMC), ktorý obsahuje doplnok, ktorý nám umožňuje vizualizovať údaje zhromaždené JFR.

Tieto tri komponenty - JFR, jcmd a JMC - vytvoriť kompletnú sadu na zhromažďovanie informácií o behu na nízkej úrovni spusteného programu Java. Tieto informácie sa nám môžu javiť ako veľmi užitočné pri optimalizácii nášho programu alebo pri diagnostike, keď sa niečo pokazí.

Ak máme v počítači nainštalované rôzne verzie Java, je to dôležité uistite sa, že kompilátor Java (javac), spúšťač Java (java) a vyššie uvedené nástroje (JFR, jcmd a JMC) sú z rovnakej distribúcie Java. V opačnom prípade existuje riziko, že nebudete môcť vidieť žiadne užitočné údaje, pretože dátové formáty JFR rôznych verzií nemusia byť kompatibilné.

JFR má dva hlavné pojmy: udalosti a tok údajov. Poďme o nich v krátkosti diskutovať.

3.1. Diania

JFR zhromažďuje udalosti, ktoré sa vyskytujú v JVM pri spustení aplikácie Java. Tieto udalosti súvisia so stavom samotného JVM alebo so stavom programu. Udalosť má názov, časovú pečiatku a ďalšie informácie (napríklad informácie o vlákne, zásobník vykonania a stav haldy).

Existujú tri typy udalostí ktoré JFR zhromažďuje:

  • okamžitá udalosť sa okamžite zaznamená, keď k tomu dôjde
  • udalosť trvania je prihlásený, ak jeho trvanie presahuje stanovenú hranicu
  • ukážková udalosť sa používa na vzorkovanie aktivity systému

3.2. Dátový tok

Udalosti, ktoré JFR zhromažďuje, obsahujú obrovské množstvo údajov. Z tohto dôvodu je zámerne JFR dostatočne rýchly na to, aby nebránil programu.

JFR ukladá údaje o udalostiach do jedného výstupného súboru, flight.jfr.

Ako vieme, diskové I / O operácie sú dosť drahé. Preto JFR používa rôzne vyrovnávacie pamäte na ukladanie zhromaždených údajov pred vyprázdnením blokov údajov na disk. Veci sa môžu stať trochu zložitejšími, pretože v rovnakom okamihu môže mať program viac registračných procesov s rôznymi možnosťami.

Kvôli tomu, vo výstupnom súbore môžeme nájsť viac údajov, ako požadujeme, alebo nemusí byť v chronologickom poradí. Túto skutočnosť by sme si možno ani nevšimli, ak použijeme JMC, pretože vizualizuje udalosti v chronologickom poradí.

V niektorých zriedkavých prípadoch môže JFR zlyhať pri vyprázdňovaní údajov (napríklad keď je príliš veľa udalostí alebo v prípade výpadku prúdu). Ak k tomu dôjde, JFR sa nás snaží informovať, že vo výstupnom súbore môže chýbať údaj.

4. Ako používať Java Flight Recorder

JFR je experimentálna vlastnosť, a preto sa jeho použitie môže meniť. V skutočnosti v predchádzajúcich distribúciách musíme aktivovať komerčné funkcie, aby sme ich mohli použiť vo výrobe. Počnúc JDK 11 ho však môžeme používať bez toho, aby sme niečo aktivovali. Vždy môžeme nahliadnuť do oficiálnych poznámok k vydaniu Java, aby sme zistili, ako sa tento nástroj používa.

Pre JDK 8, aby sme mohli aktivovať JFR, mali by sme spustiť JVM s možnosťami + UnlockCommercialFeatures a + FlightRecorder.

Ako sme už spomenuli vyššie, existujú dva spôsoby aktivácie JFR. Keď ju aktivujeme súčasne so spustením aplikácie, urobíme to z príkazového riadku. Keď je aplikácia už spustená, použijeme diagnostický príkazový nástroj.

4.1. Príkazový riadok

Najskôr zostavíme program * .java spis do a *.trieda pomocou štandardného kompilátora java javac.

Keď bude kompilácia úspešná, môžeme program spustiť s nasledujúcimi možnosťami:

java -XX: + UnlockCommercialFeatures -XX: + FlightRecorder -XX: StartFlightRecording = trvanie = 200 s, názov súboru = flight.jfr cesta k súboru triedy

kde cesta k súboru triedy je vstupným bodom aplikácie *.trieda spis.

Tento príkaz spustí aplikáciu a aktivuje nahrávanie, ktoré sa spustí okamžite a netrvá dlhšie ako 200 sekúnd. Zhromaždené údaje sa uložia do výstupného súboru, flight.jfr. Ostatné možnosti si podrobnejšie popíšeme v nasledujúcej časti.

4.2. Diagnostický príkazový nástroj

Tiež môžeme začať registrovať udalosti pomocou jcmd nástroj. Napríklad:

jcmd 1234 JFR. trvanie spustenia = 100 s názov súboru = flight.jfr

Pred JDK 11, aby sme mohli týmto spôsobom aktivovať JFR, mali by sme aplikáciu spustiť s odomknutými komerčnými funkciami:

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

Po spustení aplikácie použijeme jej ID procesu na vykonávanie rôznych príkazov, ktoré majú nasledujúci formát:

jcmd [parametre]

Tu je kompletný zoznam diagnostických príkazov:

  • JFR.štart - spustí nové nahrávanie JFR
  • Kontrola JFR - kontroluje prebiehajúce záznamy JFR
  • JFR.zastav - zastaví konkrétne nahrávanie JFR
  • JFR.dump - kopíruje obsah záznamu JFR do súboru

Každý príkaz má rad parametrov. Napríklad JFR.štart príkaz má nasledujúce parametre:

  • názov - názov nahrávky; slúži na to, aby bolo možné túto nahrávku neskôr odkazovať s inými príkazmi
  • meškanie - rozmerný parameter pre časové oneskorenie začiatku nahrávania, predvolená hodnota je 0s
  • trvanie - rozmerový parameter pre časový interval trvania záznamu; predvolená hodnota je 0 s, čo znamená neobmedzené
  • názov súboru - názov súboru, ktorý obsahuje zhromaždené údaje
  • max - rozmerový parameter pre maximálny vek zhromaždených údajov; predvolená hodnota je 0 s, čo znamená neobmedzené
  • maximálna veľkosť - maximálna veľkosť vyrovnávacích pamätí pre zhromaždené údaje v bajtoch; predvolená hodnota je 0, čo znamená, že nie je žiadna maximálna veľkosť

Príklad použitia týchto parametrov sme už videli na začiatku tejto časti. Úplný zoznam parametrov môžeme kedykoľvek vyhľadať v oficiálnej dokumentácii Java Flight Recorded.

Aj keď je JFR navrhnutý tak, aby čo najmenej ovplyvňoval výkon JVM a aplikácie, je lepšie obmedziť maximálne množstvo zhromaždených údajov nastavením aspoň jedného z parametrov: trvanie, maxalebo maximálna veľkosť.

5. Java Flight Recorder v akcii

Poďme si teraz demonštrovať JFR v akcii pomocou ukážkového programu.

5.1. Ukážkový program

Náš program vkladá objekty do zoznamu, kým OutOfMemoryError vyskytuje. Potom program jednu sekundu spí:

public static void main (String [] args) {List items = new ArrayList (1); skus {while (true) {items.add (new Object ()); }} catch (OutOfMemoryError e) {System.out.println (e.getMessage ()); } uplatniť položky.size ()> 0; skus {Thread.sleep (1000); } catch (InterruptedException e) {System.out.println (e.getMessage ()); }}

Bez vykonania tohto kódu môžeme zistiť potenciálnu nevýhodu: zatiaľ čo slučka povedie k vysokému využitiu procesora a pamäte. Použime JFR, aby sme videli tieto nevýhody a pravdepodobne našli ďalšie.

5.2. Spustite registráciu

Najskôr zostavíme náš program vykonaním nasledujúceho príkazu z príkazového riadku:

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

V tomto okamihu by sme mali nájsť súbor FlightRecorder.class v out / com / baeldung / flightrecorder adresár.

Teraz spustíme program s nasledujúcimi možnosťami:

java -XX: + UnlockCommercialFeatures -XX: + FlightRecorder -XX: StartFlightRecording = trvanie = 200 s, názov súboru = flight.jfr -cp ./out/ com.baeldung.flightrecorder.FlightRecorder

5.3. Vizualizácia údajov

Teraz súbor nakŕmime flight.jfr do Java Mission Control, ktorá je súčasťou distribúcie JDK. Pomáha nám pekne a intuitívne vizualizovať údaje o našich udalostiach.

Jeho hlavná obrazovka nám zobrazuje informácie o tom, ako program používal CPU počas jeho vykonávania. Vidíme, že procesor bol veľmi zaťažený, čo sa vďaka zatiaľ čo slučka:

Na ľavej strane pohľadu vidíme úseky Všeobecné, Pamäť, Zákonníkaa Nite, medzi inými. Každá sekcia obsahuje rôzne karty s podrobnými informáciami. Napríklad tab Horúce metódy oddielu Zákonníka obsahuje štatistiku volaní metód:

Na tejto karte môžeme zistiť ďalšiu nevýhodu nášho príkladu programu: metóda java.util.ArrayList.grow (int) bol zavolaný 17-krát s cieľom zväčšiť kapacitu poľa zakaždým, keď nebolo dosť miesta na pridanie objektu.

V realistickejších programoch sa môžeme dočkať mnohých ďalších užitočných informácií:

  • štatistika vytvorených objektov, keď ich vytvoril a zničil smetiar
  • podrobná správa o chronológii vlákien, keď boli uzamknuté alebo aktívne
  • ktoré I / O operácie aplikácia vykonávala

6. Záver

V tomto článku sme si predstavili tému monitorovania a profilovania aplikácie Java pomocou Java Flight Recorder. Tento nástroj zostáva experimentálny, preto by sme mali nájsť úplné a najnovšie informácie na jeho oficiálnych stránkach.

Útržok kódu je ako vždy k dispozícii v našom úložisku Github.


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