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.