Különböző módszerek a Java kupaclerakatok elfogására

1. Bemutatkozás

Ebben a cikkben különféle módszereket mutatunk be egy halomdepper rögzítésére a Java-ban.

A kupac dump egy pillanatkép az összes objektumról, amely egy bizonyos pillanatban a JVM memóriájában van. Nagyon hasznosak a memóriaszivárgással kapcsolatos problémák elhárításához és a Java-alkalmazások optimalizálásához.

A halmokat általában bináris formátumú hprof fájlokban tárolják. Megnyithatjuk és elemezhetjük ezeket a fájlokat olyan eszközök segítségével, mint a jhat vagy a JVisualVM. Ezenkívül az Eclipse felhasználók számára nagyon gyakori a MAT használata.

A következő szakaszokban több eszközön és megközelítésen megyünk keresztül egy kupaclerakó létrehozásához, és megmutatjuk a fő különbségeket közöttük.

2. JDK Tools

A JDK számos eszközzel rendelkezik a kupacok különböző módokon történő rögzítésére. Mindezek az eszközök a kuka mappa a JDK otthoni könyvtárában. Ezért elindíthatjuk őket a parancssorból, amíg ez a könyvtár szerepel a rendszer elérési útjában.

A következő szakaszokban bemutatjuk, hogyan kell használni ezeket az eszközöket a kupacdombok rögzítéséhez.

2.1. jmap

A jmap egy eszköz a futó JVM memóriájának statisztikáinak kinyomtatásához. Használhatjuk helyi vagy távoli folyamatokhoz.

Ahhoz, hogy egy jmap használatával rögzítsünk egy kupacot, használnunk kell a lerak választási lehetőség:

jmap -dump: [élő], format = b, fájl = 

Ezzel a lehetőséggel együtt több paramétert is meg kell adnunk:

  • élő: ha be van állítva, akkor csak olyan objektumokat nyomtat ki, amelyek aktív referenciákkal rendelkeznek, és elveti azokat, amelyek készen állnak a szemétgyűjtésre. Ez a paraméter nem kötelező
  • formátum = b: megadja, hogy a dump fájl bináris formátumú lesz. Ha nincs beállítva, akkor az eredmény ugyanaz
  • fájl: az a fájl, ahova a kiírást írják
  • pid: a Java folyamat azonosítója

Ilyen például a következő:

jmap -dump: élő, format = b, file = / tmp / dump.hprof 12587

Ne feledje, hogy könnyen megszerezhetjük a pid Java folyamat használatát a jps parancs.

Tartsd észben, hogyA jmap kísérleti eszközként került bevezetésre a JDK-ban, és ez nem támogatott. Ezért egyes esetekben előnyösebb lehet más eszközöket használni.

2.2. jcmd

A jcmd egy nagyon komplett eszköz, amely parancskérések küldésével működik a JVM számára. Ugyanabban a gépben kell használnunk, ahol a Java folyamat fut.

A sok parancs közül az egyik a GC.heap_dump. Használhatjuk egy halomlerakó megszerzéséhez, csak a pid a folyamat és a kimeneti fájl elérési útja:

jcmd GC.heap_dump 

Azokkal a paraméterekkel hajthatjuk végre, amelyeket korábban használtunk:

jcmd 12587 GC.heap_dump /tmp/dump.hprof

A jmap-hoz hasonlóan a létrehozott dump is bináris formátumú.

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, elhá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 számunkra, hogy rögzítsen egy kupacat. Ha jobb egérgombbal kattintunk egy Java folyamatra, és kiválasztjuk a „Heap Dump” opcióval az eszköz létrehoz egy kupacdumpot, és megnyitja egy új lapon:

Figyelje meg, hogy megtalálhatjuk a fájlban létrehozott fájl elérési útját "Alapinformáció" szakasz.

A JDK 9-től kezdődően a Visual VM nem szerepel az Oracle JDK és az Open JDK terjesztésekben. 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.

3. Készítsen automatikusan egy kupacdombot

Az összes olyan eszköz, amelyet az előző szakaszokban bemutattunk, a halomlerakók kézi rögzítésére szolgál egy adott időpontban. Bizonyos esetekben egy halomlerakót szeretnénk beszerezni, amikor a java.lang.OutOfMemoryError fordul elő, így segít kivizsgálni a hibát.

Ezekben az esetekben A Java biztosítja a HeapDumpOnOutOfMemoryError parancssori opció, amely halom kiírást generál, amikor a java.lang.OutOfMemoryError dobják:

java -XX: + HeapDumpOnOutOfMemoryError

Alapértelmezés szerint a dump-ot a java_pid.hprof fájlt abban a könyvtárban, ahol az alkalmazást futtatjuk. Ha másik fájlt vagy könyvtárat akarunk megadni, beállíthatjuk a HeapDumpPath választási lehetőség:

java -XX: + HeapDumpOnOutOfMemoryError -XX: HeapDumpPath =

Amikor alkalmazásunk memóriája elfogy ennek a lehetőségnek a használatával, a naplókban láthatjuk a létrehozott fájlt, amely tartalmazza a kupacdumpot:

java.lang.OutOfMemoryError: A kért tömb mérete meghaladja a VM korlátot at com.baeldung.heapdump.App.main (App.java:7)

A fenti példában a java_pid12587.hprof fájl.

Mint láthatjuk, ez a lehetőség nagyon hasznos és nincs költség, ha egy alkalmazást futtat ezzel az opcióval. Ezért nagyon ajánlott ezt az opciót mindig használni, különösen a gyártásban.

Végül, ez az opció futás közben is megadható a HotSpotDiagnostic MBean. Ehhez használhatjuk a JConsole-t és beállíthatjuk a HeapDumpOnOutOfMemoryError VM opció igaz:

Ebben a cikkben további információkat találhatunk az MBeans-ról és a JMX-ről.

4. JMX

A cikkben az utolsó megközelítés a JMX használata. Használjuk a HotSpotDiagnostic MBean amit röviden bemutattunk az előző részben. Ez az MBean a dumpHeap módszer 2 paramétert fogad el:

  • Kimeneti fájl: a dump fájljának elérési útja. A fájlnak hprof kiterjesztéssel kell rendelkeznie
  • élő: ha igazra állítja, akkor csak az aktív objektumokat tárolja el a memóriában, amint azt a jmap korábban látta

A következő szakaszokban 2 különböző módszert mutatunk be ennek a módszernek a meghívására egy kupacdepper rögzítése érdekében.

4.1. JConsole

A. Legegyszerűbb módja HotSpotDiagnostic Az MBean egy JMX klienst, például JConsole-t használ.

Ha kinyitjuk JConsole és csatlakozzon egy futó Java folyamathoz, eligazodhatunk a MBeans fülre, és keresse meg a HotSpotDiagnostic alatt com.nap.kezelés. A műveletek során megtalálhatjuk a dumpHeap korábban leírt módszer:

Mint látható, csak be kell vezetnünk a paramétereket Kimeneti fájl és élő ba,-be p0 és p1 szövegmezők a dumpHeap művelet.

4.2. Programozási mód

A másik módja a HotSpotDiagnostic Az MBean azáltal, hogy programozottan meghívja a Java kódból.

Ehhez először meg kell szereznünk egy MBeanServer példányt az alkalmazásban regisztrált MBean megszerzéséhez. Utána, egyszerűen meg kell szereznünk egy példányt a HotSpotDiagnosticMXBean és hívja annak dumpHeap módszer.

Lássuk kódban:

public static void dumpHeap (String filePath, logikai élő) dobja az IOException {MBeanServer server = ManagementFactory.getPlatformMBeanServer (); HotSpotDiagnosticMXBean mxBean = ManagementFactory.newPlatformMXBeanProxy (szerver, "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class); mxBean.dumpHeap (filePath, élő); }

Figyelje meg, hogy a hprof fájl nem írható felül. Ezért ezt figyelembe kell vennünk egy halomdobozokat kinyomtató alkalmazás létrehozásakor. Ha ezt elmulasztjuk, kivételt kapunk:

Kivétel a "main" szálban java.io.IOException: A fájl a sun.management.HotSpotDiagnostic.dumpHeap0 (natív módszer) helyen található a sun.management.HotSpotDiagnostic.dumpHeap (HotSpotDiagnostic.java:60)

5. Következtetés

Ebben az oktatóanyagban számos módszert mutattunk be egy halomdepper rögzítésére a Java-ban.

Alapszabályként emlékeznünk kell a HeapDumpOnOutOfMemoryError opció mindig Java alkalmazások futtatásakor. Más célokra bármely más eszköz tökéletesen használható, amennyiben szem előtt tartjuk a jmap nem támogatott állapotát.

Mint mindig, a példák teljes forráskódja elérhető a GitHubon.