Java alkalmazások figyelése repülésrögzítővel

1. Áttekintés

Ebben az oktatóanyagban megvizsgáljuk a Java Flight Recorder-t, annak fogalmait, alapvető parancsait és használatát.

2. Java Monitoring Utilities

A Java nemcsak programozási nyelv, hanem nagyon gazdag ökoszisztéma, sok eszközzel. A JDK olyan programokat tartalmaz, amelyek lehetővé teszik számunkra, hogy saját programokat állítsunk össze, valamint figyelemmel kísérjük azok állapotát és a Java virtuális gép állapotát a program végrehajtásának teljes életciklusa alatt.

A kuka A JDK disztribúció mappája többek között a következő programokat tartalmazza, amelyek profilozásra és figyelésre használhatók:

  • Java VisualVM (jvisualvm.exe)
  • JConsole (jconsole.exe)
  • Java Mission Control (jmc.exe)
  • Diagnosztikai parancs eszköz (jcmd.exe)

Javasoljuk, hogy tanulmányozza ennek a mappának a tartalmát, hogy tisztában legyen azzal, milyen eszközök állnak rendelkezésünkre. Felhívjuk figyelmét, hogy a Java VisualVM a múltban az Oracle és az Open JDK disztribúció része volt. Azonban, a Java 9-től kezdődően a JDK disztribúciók már nem szállítanak Java VisualVM-mel. Ezért külön kell letöltenünk a VisualVM nyílt forráskódú projekt webhelyéről.

Ebben az oktatóanyagban a Java Flight Recorderre fogunk összpontosítani. Ez nincs fent a fent említett eszközök között, mert nem önálló program. Használata szorosan kapcsolódik a fenti két eszközhöz - a Java Mission Control és a Diagnostic Command Tools.

3. Java Flight Recorder és alapvető fogalmai

A Java Flight Recorder (JFR) egy figyelő eszköz, amely információkat gyűjt a Java virtuális gép (JVM) eseményeiről egy Java alkalmazás futtatása során. A JFR a JDK disztribúció része, és integrálva van a JVM-be.

JFR az úgy tervezték, hogy a futó alkalmazás teljesítményét a lehető legkevésbé befolyásolja.

A JFR használatához aktiválnunk kell. Ezt kétféleképpen érhetjük el:

  1. Java alkalmazás indításakor
  2. diagnosztikai parancsok átadása a jcmd eszköz, ha egy Java alkalmazás már fut

A JFR-nek nincs önálló eszköze. A Java Mission Control (JMC) szoftvert használjuk, amely egy olyan beépülő modult tartalmaz, amely lehetővé teszi számunkra a JFR által gyűjtött adatok vizualizálását.

Ez a három összetevő - JFR, jcmd és JMC - készítsen egy teljes csomagot egy futó Java program alacsony szintű futási idejű adatainak összegyűjtésére. Nagyon hasznosnak találhatjuk ezeket az információkat a programunk optimalizálásakor, vagy diagnosztizálásakor, ha valami nem megfelelő.

Ha a Java különféle verziói vannak telepítve a számítógépünkre, fontos győződjön meg arról, hogy a Java fordító (javac), a Java indító (Jáva) és a fent említett eszközök (JFR, jcmd és JMC) ugyanazon Java disztribúcióból származnak. Ellenkező esetben fennáll annak a veszélye, hogy nem lát semmilyen hasznos adatot, mert a különböző verziók JFR adatformátumai nem kompatibilisek.

A JFR-nek két fő fogalma van: események és adatfolyam. Beszéljük meg röviden őket.

3.1. Események

A JFR összegyűjti a Java alkalmazás futtatásakor a JVM-ben előforduló eseményeket. Ezek az események kapcsolódnak a JVM állapotához vagy a program állapotához. Az eseménynek van neve, időbélyege és további információi (például szálinformációk, végrehajtási verem és a halom állapota).

Vannak háromféle esemény hogy a JFR összegyűjti:

  • azonnali esemény azonnal bekerül a naplóba, ha megtörténik
  • időtartamú esemény naplózásra kerül, ha annak időtartama egy megadott küszöbértéket elér
  • egy minta esemény a rendszer aktivitásának mintavételére szolgál

3.2. Adatáramlás

A JFR által gyűjtött események hatalmas mennyiségű adatot tartalmaznak. Emiatt a JFR a tervezése alapján elég gyors ahhoz, hogy ne akadályozza a programot.

A JFR egyetlen eseményfájlba menti az események adatait, flight.jfr.

Mint tudjuk, a lemez I / O műveletek meglehetősen drágák. Ezért a JFR különféle puffereket használ az összegyűjtött adatok tárolásához, mielőtt az adatblokkokat lemezre mossa. A dolgok kissé összetettebbé válhatnak, mivel ugyanabban a pillanatban egy programnak több regisztrációs folyamata lehet, különböző opciókkal.

Emiatt, előfordulhat, hogy a kimeneti fájlban több adatot találunk, mint amennyit kértek, vagy nem kronológiai sorrendben. Lehet, hogy észre sem vesszük ezt a tényt, ha a JMC-t használjuk, mert időrendben jeleníti meg az eseményeket.

Néhány ritka esetben előfordulhat, hogy a JFR nem mossa ki az adatokat (például túl sok esemény esetén vagy áramkimaradás esetén). Ha ez bekövetkezik, a JFR megpróbál értesíteni minket arról, hogy a kimeneti fájlból hiányozhat egy adat.

4. A Java Flight Recorder használata

A JFR kísérleti tulajdonság, ezért használata változhat. Valójában a korábbi disztribúciókban aktiválnunk kell a kereskedelmi funkciókat annak érdekében, hogy felhasználhassuk őket a gyártásban. A JDK 11-től kezdődően azonban bármit aktiválhatunk. Mindig megismerhetjük a Java hivatalos kiadási megjegyzéseit az eszköz használatának ellenőrzéséhez.

Ahhoz, hogy a JDK 8 aktiválni tudja a JFR-t, el kell indítanunk a JVM-et az opciókkal + UnlockCommercialFeatures és + FlightRecorder.

Mint fent említettük, kétféle módon lehet aktiválni a JFR-t. Amikor az alkalmazás indításával egyidejűleg aktiváljuk, akkor a parancssorból tesszük. Amikor az alkalmazás már fut, akkor használjuk a diagnosztikai parancsot.

4.1. Parancs sor

Először összeállítjuk a programot *.Jáva fájlt a *.osztály a standard java fordító használatával javac.

Miután a fordítás sikeres volt, elindíthatjuk a programot a következő lehetőségekkel:

java -XX: + UnlockCommercialFeatures -XX: + FlightRecorder -XX: StartFlightRecording = időtartam = 200s, fájlnév = flight.jfr elérési út osztály-fájlig

hol path-to-class-file az alkalmazás belépési pontja *.osztály fájl.

Ez a parancs elindítja az alkalmazást, és aktiválja a felvételt, amely azonnal megkezdődik és legfeljebb 200 másodpercig tart. Az összegyűjtött adatokat egy kimeneti fájlba menti, flight.jfr. A további lehetőségeket a következő szakaszban írjuk le részletesebben.

4.2. Diagnosztikai parancs eszköz

Az események regisztrálását a jcmd eszköz. Például:

jcmd 1234 JFR.indítás időtartama = 100s fájlnév = flight.jfr

A JDK 11 előtt annak érdekében, hogy ilyen módon aktiválhassuk a JFR-t, el kell indítanunk az alkalmazást nyitott kereskedelmi funkciókkal:

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

Amint az alkalmazás fut, a folyamatazonosítóját különféle parancsok végrehajtására használjuk, amelyek a következő formátumban jelentkeznek:

jcmd [paraméterek]

A diagnosztikai parancsok teljes listája itt található:

  • JFR.start - új JFR felvételt indít
  • JFR.ellenőrizze - ellenőrzi a JFR felvétel (ek) futását
  • JFR.stop - leállít egy adott JFR felvételt
  • JFR.dump - a JFR felvétel tartalmát fájlba másolja

Minden parancsnak van egy sor paramétere. Például a JFR.start parancsnak a következő paraméterei vannak:

  • név - a felvétel neve; arra szolgál, hogy ezt a felvételt később más parancsokkal lehessen hivatkozni
  • késleltetés - dimenziós paraméter a felvétel kezdetének késleltetéséhez, az alapértelmezett érték 0 s
  • időtartamát - dimenziós paraméter a felvétel időtartamára; az alapértelmezett érték 0s, ami azt jelenti, hogy korlátlan
  • fájl név - az összegyűjtött adatokat tartalmazó fájl neve
  • maxage - dimenzióparaméter az összegyűjtött adatok maximális életkorához; az alapértelmezett érték 0s, ami azt jelenti, hogy korlátlan
  • maxsize - a bájtokban gyűjtött adatok puffereinek maximális mérete; az alapértelmezett érték 0, ami azt jelenti, hogy nincs maximális méret

A szakasz elején már láttunk példát ezeknek a paramétereknek a használatára. A paraméterek teljes listáját mindig a Java Flight Recorded hivatalos dokumentációjában találhatjuk meg.

Annak ellenére, hogy a JFR-t úgy tervezték, hogy a lehető legkevesebb lábnyoma legyen a JVM és az alkalmazás teljesítményén, jobb, ha legalább az egyik paraméter beállításával korlátozza az összegyűjtött adatok maximális mennyiségét: időtartamát, maxage, vagy maxsize.

5. A Java Flight Recorder működés közben

Most mutatjuk be a JFR működését egy példa program segítségével.

5.1. Példaprogram

Programunk objektumokat illeszt egy listába, amíg egy OutOfMemoryError bekövetkezik. Ezután a program alszik egy másodpercig:

public static void main (String [] args) {List elemek = new ArrayList (1); próbáld meg a {while (true) {items.add (new Object ()); }} catch (OutOfMemoryError e) {System.out.println (e.getMessage ()); } állítson elemeket.méret ()> 0; próbáld ki a {Thread.sleep (1000); } catch (InterruptedException e) {System.out.println (e.getMessage ()); }}

A kód végrehajtása nélkül észrevehetünk egy lehetséges hátrányt: a míg ciklus magas CPU- és memóriafelhasználást eredményez. Használjuk a JFR-t, hogy lássuk ezeket a hátrányokat, és valószínűleg találjunk másokat is.

5.2. Kezdje el regisztrálni

Először a következő parancs végrehajtásával állítjuk össze programunkat:

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

Ezen a ponton meg kell találnunk egy fájlt FlightRecorder.class ban,-ben out / com / baeldung / flightrecorder Könyvtár.

Most a következő lehetőségekkel indítjuk a programot:

java -XX: + UnlockCommercialFeatures -XX: + FlightRecorder -XX: StartFlightRecording = időtartam = 200s, fájlnév = flight.jfr -cp ./out/ com.baeldung.flightrecorder.FlightRecorder

5.3. Vizualizálja az adatokat

Most betápláljuk a fájlt flight.jfr nak nek Java Mission Control, amely a JDK disztribúció része. Segít abban, hogy szép és intuitív módon jelenítsük meg eseményeink adatait.

Fő képernyője megmutatja nekünk az információkat arról, hogy a program hogyan használta a CPU-t a végrehajtása során. Látjuk, hogy a CPU erősen terhelt volt, ami a míg hurok:

A nézet bal oldalán metszeteket látunk Tábornok, memória, Kód, és Szálaktöbbek között. Minden szakasz különféle füleket tartalmaz, részletes információkkal. Például tab Forró módszerek szakaszának Kód a módszerhívások statisztikáját tartalmazza:

Ezen a lapon felfedezhetjük a példa programunk másik hátrányát: a metódust java.util.ArrayList.grow (int) 17-szer hívták a tömb kapacitás növelése érdekében, valahányszor nem volt elegendő hely egy objektum hozzáadásához.

Reálisabb programokban sok más hasznos információt láthatunk:

  • statisztikák a létrehozott objektumokról, amikor azokat a szemétgyűjtő létrehozta és megsemmisítette
  • részletes jelentés a szálak kronológiájáról, amikor zároltak vagy aktívak voltak
  • mely I / O műveleteket hajtotta végre az alkalmazás

6. Következtetés

Ebben a cikkben bemutattuk a Java alkalmazás megfigyelésének és profilozásának témáját a Java Flight Recorder segítségével. Ez az eszköz továbbra is kísérleti jellegű, ezért teljesebb és legfrissebb információkért forduljon a hivatalos webhelyéhez.

Mint mindig, a kódrészlet elérhető a Github adattárunkban.