{"id":489,"date":"2024-08-24T21:05:17","date_gmt":"2024-08-24T20:05:17","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=489"},"modified":"2024-09-18T21:08:07","modified_gmt":"2024-09-18T20:08:07","slug":"verschiedene-wege-einen-heap-dump-der-jvm-in-java-auszuloesen","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=489","title":{"rendered":"Verschiedene Wege, einen Heap-Dump der JVM in Java auszul\u00f6sen"},"content":{"rendered":"\n<p>Ein Heap-Dump ist ein Abbild des Speicherzustands der Java Virtual Machine (JVM) zu einem bestimmten Zeitpunkt. Er enth\u00e4lt Informationen \u00fcber alle Objekte, die im Speicher vorhanden sind, sowie deren Verbindungen untereinander. Ein solcher Dump kann besonders hilfreich sein, wenn es darum geht, Speicherprobleme wie Memory Leaks oder Out-of-Memory-Fehler zu analysieren. Es gibt verschiedene Methoden, um einen Heap-Dump zu erzeugen, von einfachen Kommandozeilenbefehlen bis hin zu automatisierten L\u00f6sungen direkt im Code.<\/p>\n\n\n\n<p>In diesem Artikel werden wir die wichtigsten M\u00f6glichkeiten betrachten, wie man in Java einen Heap-Dump der JVM ausl\u00f6sen kann, und erkl\u00e4ren, in welchen Szenarien diese Methoden sinnvoll sind.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Heap-Dump mit dem <code>jmap<\/code>-Tool ausl\u00f6sen<\/h3>\n\n\n\n<p>Eine der einfachsten Methoden, einen Heap-Dump zu erzeugen, ist die Verwendung des Tools <code>jmap<\/code>, das standardm\u00e4\u00dfig mit der Java Development Kit (JDK) ausgeliefert wird. Dieses Tool erm\u00f6glicht das Erstellen eines Dumps zur Laufzeit, ohne dass die JVM neugestartet werden muss.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Verwendung von <code>jmap<\/code><\/h4>\n\n\n\n<p>Der Befehl, um einen Heap-Dump mit <code>jmap<\/code> zu erstellen, lautet wie folgt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">jmap -dump:format=b,file=heapdump.hprof <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pid<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dabei steht <code>&lt;pid&gt;<\/code> f\u00fcr die Prozess-ID der laufenden JVM. Die Datei <code>heapdump.hprof<\/code> ist der Dump, der generiert wird.<\/p>\n\n\n\n<p>Um die PID der JVM zu ermitteln, k\u00f6nnen Sie das <code>jps<\/code>-Tool verwenden, das ebenfalls Teil des JDK ist:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">jps<\/code><\/span><\/pre>\n\n\n<p>Dies zeigt eine Liste der Java-Prozesse auf Ihrem System an, inklusive der jeweiligen PIDs.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Einschr\u00e4nkungen<\/h4>\n\n\n\n<p>Die Verwendung von <code>jmap<\/code> setzt voraus, dass die JVM mit dem richtigen Benutzer gestartet wurde oder der Befehl mit Administratorrechten ausgef\u00fchrt wird. Zudem ist zu beachten, dass das Erstellen eines Heap-Dumps eine signifikante Menge an Systemressourcen verbraucht, was zu einer tempor\u00e4ren Verlangsamung der Anwendung f\u00fchren kann.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Heap-Dump bei einem Out-of-Memory-Fehler automatisch erstellen<\/h3>\n\n\n\n<p>Java bietet die M\u00f6glichkeit, automatisch einen Heap-Dump zu erzeugen, wenn ein <code>OutOfMemoryError<\/code> auftritt. Diese Funktion ist besonders n\u00fctzlich in Produktionsumgebungen, in denen Speicherprobleme m\u00f6glicherweise nur selten oder unter bestimmten Lastbedingungen auftreten.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Konfiguration in den JVM-Optionen<\/h4>\n\n\n\n<p>Um einen Heap-Dump bei einem Out-of-Memory-Fehler zu erzeugen, kann die JVM mit der folgenden Option gestartet werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pfad-zum-dump<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die Option <code>-XX:+HeapDumpOnOutOfMemoryError<\/code> sorgt daf\u00fcr, dass ein Dump erzeugt wird, sobald der Fehler auftritt. Mit der Option <code>-XX:HeapDumpPath<\/code> kann der Speicherort f\u00fcr den Dump angegeben werden. Ist kein Pfad angegeben, wird der Dump im Standardverzeichnis der JVM gespeichert.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Vorteile und Nachteile<\/h4>\n\n\n\n<p>Der Vorteil dieser Methode ist, dass der Heap-Dump genau in dem Moment erzeugt wird, in dem das Speicherproblem auftritt, was eine pr\u00e4zise Analyse des Problems erm\u00f6glicht. Der Nachteil ist jedoch, dass die Anwendung abst\u00fcrzt, sobald der Fehler auftritt, was in kritischen Umgebungen problematisch sein kann.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Programmgesteuerte Erzeugung eines Heap-Dumps<\/h3>\n\n\n\n<p>Es ist auch m\u00f6glich, einen Heap-Dump direkt aus dem Java-Code heraus zu erzeugen. Dies ist insbesondere dann n\u00fctzlich, wenn man gezielt an bestimmten Stellen im Code einen Speicher-Snapshot erstellen m\u00f6chte, beispielsweise nach einer bestimmten Anzahl von Operationen oder bei bestimmten Bedingungen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Verwendung der <code>com.sun.management<\/code>-Bibliothek<\/h4>\n\n\n\n<p>Seit Java 1.6 bietet das JDK die M\u00f6glichkeit, \u00fcber die <code>HotSpotDiagnosticMXBean<\/code> programmatisch einen Heap-Dump zu erstellen. Dazu muss die Klasse <code>com.sun.management.HotSpotDiagnosticMXBean<\/code> verwendet werden.<\/p>\n\n\n\n<p>Hier ein Beispielcode, wie ein Heap-Dump programmgesteuert erzeugt werden kann:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.sun.management.HotSpotDiagnosticMXBean;\n<span class=\"hljs-keyword\">import<\/span> java.lang.management.ManagementFactory;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">HeapDumpGenerator<\/span> <\/span>{\n\n    private <span class=\"hljs-keyword\">static<\/span> final <span class=\"hljs-built_in\">String<\/span> HOTSPOT_BEAN_NAME = <span class=\"hljs-string\">\"com.sun.management:type=HotSpotDiagnostic\"<\/span>;\n    private <span class=\"hljs-keyword\">static<\/span> HotSpotDiagnosticMXBean hotspotMBean;\n\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> dumpHeap(<span class=\"hljs-built_in\">String<\/span> filePath, boolean live) throws Exception {\n        <span class=\"hljs-keyword\">if<\/span> (hotspotMBean == <span class=\"hljs-literal\">null<\/span>) {\n            hotspotMBean = ManagementFactory.newPlatformMXBeanProxy(\n                    ManagementFactory.getPlatformMBeanServer(), HOTSPOT_BEAN_NAME, HotSpotDiagnosticMXBean.class);\n        }\n        hotspotMBean.dumpHeap(filePath, live);\n    }\n\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-keyword\">try<\/span> {\n            dumpHeap(<span class=\"hljs-string\">\"heapdump.hprof\"<\/span>, <span class=\"hljs-literal\">true<\/span>);\n        } <span class=\"hljs-keyword\">catch<\/span> (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird der Heap-Dump in der Datei <code>heapdump.hprof<\/code> gespeichert. Der Parameter <code>live<\/code> bestimmt, ob auch nicht mehr erreichbare Objekte im Dump enthalten sein sollen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Vorteile und Nachteile<\/h4>\n\n\n\n<p>Diese Methode bietet gro\u00dfe Flexibilit\u00e4t, da der Heap-Dump zu einem beliebigen Zeitpunkt erstellt werden kann. Allerdings ist die <code>com.sun.management<\/code>-Bibliothek nicht Teil des offiziellen Java-APIs, was bedeutet, dass dieser Ansatz plattformabh\u00e4ngig ist und m\u00f6glicherweise nicht in allen JVM-Implementierungen funktioniert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Verwendung von VisualVM<\/h3>\n\n\n\n<p>VisualVM ist ein leistungsstarkes Tool, das mit dem JDK ausgeliefert wird und zur \u00dcberwachung und Analyse von Java-Anwendungen verwendet werden kann. Es bietet eine grafische Benutzeroberfl\u00e4che, mit der Heap-Dumps manuell ausgel\u00f6st werden k\u00f6nnen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Schritte zur Erstellung eines Heap-Dumps in VisualVM<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Starten Sie VisualVM (im JDK-Ordner unter <code>bin\/<\/code> verf\u00fcgbar).<\/li>\n\n\n\n<li>W\u00e4hlen Sie die JVM aus, f\u00fcr die Sie einen Heap-Dump erstellen m\u00f6chten.<\/li>\n\n\n\n<li>Klicken Sie mit der rechten Maustaste auf die JVM und w\u00e4hlen Sie \u201eHeap Dump\u201c.<\/li>\n<\/ol>\n\n\n\n<p>Der erstellte Heap-Dump kann direkt in VisualVM analysiert werden. VisualVM bietet eine Vielzahl von Funktionen zur Analyse des Speicherzustands, wie die Untersuchung von Objektreferenzen und das Finden von Speicherlecks.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Vorteile und Nachteile<\/h4>\n\n\n\n<p>VisualVM ist eine einfache und intuitive Methode zur Analyse von Java-Anwendungen und eignet sich besonders gut f\u00fcr Entwickler, die einen \u00dcberblick \u00fcber den aktuellen Speicherverbrauch gewinnen m\u00f6chten. Allerdings ist die manuelle Erstellung eines Dumps nicht f\u00fcr automatisierte Umgebungen oder f\u00fcr Anwendungen geeignet, die im Hintergrund ohne Benutzerinteraktion laufen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Heap-Dump \u00fcber das JMX-Interface<\/h3>\n\n\n\n<p>Eine weitere Methode zur Erzeugung eines Heap-Dumps besteht in der Verwendung des Java Management Extensions (JMX)-Interfaces. \u00dcber JMX k\u00f6nnen Java-Anwendungen von au\u00dfen \u00fcberwacht und gesteuert werden, einschlie\u00dflich der M\u00f6glichkeit, Heap-Dumps zu erzeugen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Aktivierung von JMX in der JVM<\/h4>\n\n\n\n<p>Um JMX in einer JVM zu aktivieren, m\u00fcssen folgende JVM-Optionen gesetzt werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">-Dcom.sun.management.jmxremote\n-Dcom.sun.management.jmxremote.port=<span class=\"hljs-number\">9010<\/span>\n-Dcom.sun.management.jmxremote.authenticate=<span class=\"hljs-literal\">false<\/span>\n-Dcom.sun.management.jmxremote.ssl=<span class=\"hljs-literal\">false<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Mit diesen Einstellungen kann auf die JVM \u00fcber JMX zugegriffen werden, beispielsweise mit Tools wie <code>jconsole<\/code> oder Programmen, die auf das JMX-Interface zugreifen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Heap-Dump \u00fcber JMX ausl\u00f6sen<\/h4>\n\n\n\n<p>Mit einem Tool wie <code>jconsole<\/code> k\u00f6nnen Sie eine Verbindung zur laufenden JVM herstellen und dann einen Heap-Dump \u00fcber das MBean \u201eHotSpotDiagnostic\u201c ausl\u00f6sen, \u00e4hnlich wie es in der programmatischen L\u00f6sung beschrieben wurde.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>Es gibt verschiedene Wege, um einen Heap-Dump in Java zu erstellen, und jede Methode hat ihre eigenen Vor- und Nachteile. Tools wie <code>jmap<\/code> und VisualVM bieten einfache, benutzerfreundliche L\u00f6sungen, w\u00e4hrend programmatische Ans\u00e4tze und JMX-basierte L\u00f6sungen mehr Flexibilit\u00e4t bieten. Automatische Heap-Dumps bei Out-of-Memory-Fehlern sind besonders in Produktionsumgebungen n\u00fctzlich, in denen Speicherprobleme unter realen Bedingungen analysiert werden m\u00fcssen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Heap-Dump ist ein Abbild des Speicherzustands der Java Virtual Machine (JVM) zu einem bestimmten Zeitpunkt. Er enth\u00e4lt Informationen \u00fcber alle Objekte, die im Speicher vorhanden sind, sowie deren Verbindungen untereinander. Ein solcher Dump kann besonders hilfreich sein, wenn es darum geht, Speicherprobleme wie Memory Leaks oder Out-of-Memory-Fehler zu analysieren. Es gibt verschiedene Methoden, um [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-489","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=489"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/489\/revisions"}],"predecessor-version":[{"id":490,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/489\/revisions\/490"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}