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:

  1. Eleinte egy üres StringBuffer inicializálva van, hogy megtartsa az egyes szálak vereminformációit.
  2. 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.
  3. 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.