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:
- Java alkalmazás indításakor
- 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.