Java szálképek rögzítése
1. Áttekintés
Ebben az oktatóanyagban megvitatjuk a Java-alkalmazások szálképének rögzítésének különböző módjait.
A thread dump egy pillanatkép a Java folyamat összes szálának állapotáról. Az egyes szálak állapotát veremkövetéssel mutatjuk be, amely egy szál verem tartalmát mutatja. A szál kiírása hasznos a problémák diagnosztizálásához, mivel megjeleníti a szál aktivitását. A szálképek sima szöveggel vannak megírva, így tartalmukat fájlba menthetjük, és később egy szövegszerkesztőben megnézhetjük.
A következő szakaszokban több eszközt és megközelítést fogunk átnézni egy szál dump létrehozásához.
2. A JDK segédprogramok használata
A JDK számos segédprogramot kínál, amelyek képesek rögzíteni a Java-alkalmazások szálak kiírását. Az összes közmű a kuka mappa a JDK otthoni könyvtárában. Ezért ezeket a segédprogramokat a parancssorból futtathatjuk, amíg ez a könyvtár a rendszerünk elérési útján található.
2.1. jstack
A jstack egy parancssori JDK segédprogram, amellyel egy szál dumpot rögzíthetünk. Ehhez a pid folyamatot, és megjeleníti a szál kiírását a konzolon. Alternatív megoldásként átirányíthatjuk a kimenetét egy fájlba.
Vessünk egy pillantást az alap parancs szintaxisára a szálak kiírásának rögzítéséhez a jstack használatával:
jstack [-F] [-l] [-m]
Az összes zászló opcionális. Lássuk, mit jelentenek:
- -F az opció kényszerít egy szálat; praktikus használni, amikor jstack pid nem válaszol (a folyamat fel van függesztve)
- -l Az opció utasítja a segédprogramot, hogy keresse meg a tulajdonképes szinkronizálókat a kupacban és a zárakban
- -m opció natív veremkereteket (C & C ++) nyomtat a Java veremkeretek mellett
Használjuk ki ezt az ismeretet egy szál kiírás rögzítésével és az eredmény átirányításával egy fájlba:
jstack 17264> /tmp/threaddump.txt
Ne feledje, hogy könnyen megszerezhetjük a pid Java folyamat használatát a jps parancs.
2.2. Java Mission Control
A Java Mission Control (JMC) egy GUI eszköz, amely összegyűjti és elemzi a Java alkalmazások adatait. A JMC elindítása után megjeleníti a helyi gépen futó Java folyamatok listáját. A JMC-n keresztül távoli Java folyamatokhoz is csatlakozhatunk.
Kattintson a jobb gombbal a folyamatra, és kattintson aIndítsa el a repülésrögzítést" választási lehetőség. Ezek után a Szálak lapon a Szálak kiírása látható:

2.3. jvisualvm
A jvisualvm egy olyan grafikus felhasználói felülettel rendelkező eszköz, amely lehetővé teszi számunkra a Java alkalmazások megfigyelését, hibaelhárítását és profilozását. A grafikus felhasználói felület egyszerű, de nagyon intuitív és könnyen használható.
A sok lehetőség közül az egyik lehetővé teszi, hogy rögzítsünk egy szál kiírást. Ha jobb egérgombbal kattintunk egy Java folyamatra, és kiválasztjuk a „Thread Dump” opcióval az eszköz létrehoz egy szál kiírást és megnyitja egy új lapon:

A JDK 9-től kezdve a Visual VM nem szerepel az Oracle JDK és az Open JDK disztribúcióiban. Ezért, ha Java 9-et vagy újabb verziókat használunk, beszerezhetjük a JVisualVM-et a Visual VM nyílt forráskódú projekt webhelyéről.
2.4. jcmd
A jcmd egy olyan eszköz, amely parancskérések küldésével működik a JVM számára. Bár hatalmas, mégis nem tartalmaz távoli funkciókat - ugyanabban a gépben kell használnunk, ahol a Java folyamat fut.
A sok parancs közül az egyik Szál.nyomtatás. Csak a. Megadásával használhatjuk egy szál kiíratásához pid a folyamat:
jcmd 17264 Szál.nyomtatás
2.5. jconsole
A jconsole segítségével megvizsgálhatjuk az egyes szálak veremnyomait. Ha kinyitjuk jconsole és csatlakozzon egy futó Java folyamathoz, eligazodhatunk a Szálak fülre, és keresse meg az egyes szálak verem nyomát:

2.6. Összegzés
Tehát, mint kiderült, a JDK segédprogramok segítségével sokféle módon rögzíthetünk egy szál dumpot. Szánjunk egy percet arra, hogy elmélkedjünk mindegyiken, és felvázoljuk előnyeiket és hátrányaikat:
- jstack: biztosítja a leggyorsabb és legegyszerűbb módszert a szálak kiírásának rögzítésére. A Java 8-tól kezdve azonban jobb alternatívák állnak rendelkezésre
- jmc: továbbfejlesztett JDK profilalkotási és diagnosztikai eszköz. Minimalizálja a teljesítmény-rezsit, amely általában a profilalkotási eszközök problémája
- jvisualvm: könnyű és nyílt forráskódú profilkészítő eszköz kiváló GUI konzollal
- jcmd: rendkívül erőteljes és Java 8 és újabb verziókhoz ajánlott. Egyetlen eszköz, amely sokféle célt szolgál - a thread dump rögzítése (jstack), kupaclerakó (jmap), a rendszer tulajdonságai és a parancssori argumentumok (jinfo)
- jconsole: vizsgáljuk meg a menetköteg nyomkövetési információit
3. A parancssorból
Vállalati alkalmazáskiszolgálókon biztonsági okokból csak a JRE telepítve van. Így nem használhatjuk a fent említett segédprogramokat, mivel ezek a JDK részét képezik. Vannak azonban különféle parancssori alternatívák, amelyek segítségével könnyedén rögzíthetjük a szálak kiírásait.
3.1. megöl -3 parancs (Linux / Unix)
A Unix-szerű rendszerekben a szálak kiírásának legegyszerűbb módja a megöl parancs, amellyel jelet küldhetünk egy folyamatnak a megöl() rendszerhívás. Ebben a használati esetben elküldjük a -3 jel.
Használjuk ugyanezt pid korábbi példákból vessünk egy pillantást a felhasználásra megöl egy szál kiírás rögzítéséhez:
ölni -3 17264
Így a jelet vevő Java folyamat kinyomtatja a szál kiírását a standard kimenetre.
Ha a Java folyamatot a következő hangolási zászlók kombinációjával futtatjuk, akkor a szálak kiírását is átirányítja az adott fájlba:
-XX: + UnlockDiagnosticVMOptions -XX: + LogVMOutput -XX: LogFile = ~ / jvm.log
Most, ha elküldjük a -3 jel, a normál kimeneten kívül a dump itt lesz elérhető ~ / jvm.log fájl.
3.2. Ctrl + Break (Windows)
Windows operációs rendszerekben a CTRL és Szünet billentyűkombináció. A szálak kiírásához keresse meg a Java alkalmazás elindításához használt konzolt, és nyomja meg a gombot CTRL és Szünet gombokat együtt.
Érdemes megjegyezni, hogy egyes billentyűzeteken a Szünet kulcs nem érhető el. Ezért ilyen esetekben egy szál kiírása rögzíthető a CTRL, VÁLTÁS, és Szünet gombokat együtt.
Mindkét parancs kinyomtatja a szál kiírását a konzolra.
4. Programozatosan felhasználva ThreadMxBean
A cikkben tárgyalt utolsó megközelítés a JMX használata. Majd használjuk ThreadMxBean hogy rögzítse a cérnadombot. Lássuk kódban:
privát statikus String threadDump (boolean lockedMonitors, boolean lockedSynchronizers) {StringBuffer threadDump = új StringBuffer (System.lineSeparator ()); ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean (); for (ThreadInfo threadInfo: threadMXBean.dumpAllThreads (lockedMonitors, lockSSynchronizers)) {threadDump.append (threadInfo.toString ()); } return threadDump.toString (); }
A fenti programban több lépést hajtunk végre:
- Eleinte egy üres StringBuffer inicializálva van, hogy megtartsa az egyes szálak vereminformációit.
- Ezután használjuk a ManagementFactory osztály, hogy megkapja a példányát ThreadMxBean. A ManagementFactory egy gyári osztály kezelt babok beszerzéséhez a Java platformhoz. Ezenkívül a ThreadMxBean a JVM szálrendszerének kezelőfelülete.
- Beállítás lockedMonitors és lockedSynchronizers értékeket igaz azt jelzi, hogy rögzíteni kell a szinkronizálókat és az összes lezárt monitort a szál dumpban.
5. Következtetés
Ebben a cikkben számos módszert mutattunk be egy szál kiírásának rögzítésére.
Eleinte különböző JDK segédprogramokat, majd parancssori alternatívákat vitattunk meg. Az utolsó részben a JMX használatával végzett programozási megközelítéssel fejeztük be.
Mint mindig, a példa teljes forráskódja elérhető a GitHubon.