In Java liefert ein Heap-Dump eine Momentaufnahme aller Objekte, die zu einem bestimmten Zeitpunkt im Speicher der Java Virtual Machine vorhanden sind. Heap-Dumps sind nützlich bei der Behebung von Speicherverlustproblemen und der Optimierung der Speichernutzung in verschiedenen Java-Anwendungen. Details zu jeder Instanz wie Adresse, Klassenname, Typ und Verweise auf ein anderes Objekt werden im Heap-Dump vermerkt. Heap Dump verfügt über zwei Formate, z. B. das Portable Heap Dump-Format, ein binäres und ein klassisches Format in ASCI-Text. In den folgenden Abschnitten sehen wir uns verschiedene Tools und Techniken zum Generieren eines Heap-Dumps an.
Starten Sie Ihren kostenlosen Softwareentwicklungskurs
Webentwicklung, Programmiersprachen, Softwaretests und andere
Normalerweise wird dieser Heap-Dump verwendet, wenn die von uns verwendete Java-Anwendung mehr Speicher beansprucht als erwartet oder die Anwendung mit dem OutOfMemoryError abgestürzt ist. Wenn wir den Heap-Dump analysieren, hilft dies, die Grundursache der Anomalie zu identifizieren. Darüber hinaus kann Heap Dump auch verwendet werden, um Details wie die Speichernutzung jeder Klasse, die Anzahl der Objekte in jeder Klasse usw. zu identifizieren. Darüber hinaus können feine Details und die von einer Person belegte Speichermenge erfasst werden Das in der Anwendung vorhandene Java-Objekt kann ebenfalls ermittelt werden. Diese Informationen können uns helfen, den tatsächlichen Code zu identifizieren, der Speicherverlustprobleme verursacht.
Hier sind die folgenden Tools und Techniken aufgeführt
Heap-Dumps können mit verschiedenen Tools unter JDK erfasst werden, die im bin-Ordner im Home-Verzeichnis von JDK verfügbar sind. Hierzu kann die Kommandozeile verwendet werden, da das Verzeichnis im Systempfad vorhanden ist.
jmap ist ein Tool, das sowohl in lokalen als auch in Remote-Prozessen verwendet werden kann, die Speicherstatistiken in einer laufenden JVM drucken.
Um einen Heap-Dump mit einer Jmap zu generieren, kann die Dump-Option wie unten gezeigt verwendet werden.
jmap -dump:[live] , format = b , file=< path of the file > <process id>
jcmd ist ein Tool, das die Befehlsanfragen an die Java Virtual Machine sendet. Darüber hinaus muss dies auf der Maschine vorhanden sein, auf der der Java-Prozess ausgeführt wird.
Um den Heap-Dump zu erhalten, kann der Befehl GC.heap_dump verwendet werden, wobei nur die PID und der Dateipfad der Ausgabe angegeben werden müssen, wie unten gezeigt.
jcmd < pid > GC.heap_dump < path of the file >
JVisualVM ist ein Tool mit einer einfachen und intuitiven grafischen Benutzeroberfläche, die uns die Überwachung, Fehlerbehebung und Profilierung von Java-Anwendungen ermöglicht. Um damit einen Heap-Dump zu generieren, muss der Java-Prozess mit der rechten Maustaste angeklickt und die Option „Heap-Dump“ ausgewählt werden. Sobald dies erledigt ist, erstellt das Tool einen Heap-Dump und dieser wird in einem neuen Tab geöffnet.
Anstatt wie oben erwähnt manuelle Techniken zu verwenden, wird eine Befehlszeilenoption, HeapDumpOnOutOfMemoryError, verwendet, um den Heap-Dump automatisch zu erstellen, wenn ein java.lang.OutOfMemoryError ausgelöst wird:
java - XX:+HeapDumpOnOutOfMemoryError
java_pid
Anstelle des Standardpfads können auch andere Dateipfade verwendet werden, und dafür kann die Option HeapDumpPath verwendet werden, wie unten gezeigt.
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=< file_path >
Wenn die Anwendung also einen Speicherausfall auf diese Weise ausführt, können die Protokolle in der erstellten Datei angezeigt werden, die aus dem Heap-Dump besteht:
Hier wird das HotSpotDiagnostic MBean verwendet, das eine dumpHeap-Technik generiert, die 2 Parameter zulässt.
Sie sind:
outputFile, das ist der Dateipfad für den erstellten Dump. Stellen Sie sicher, dass die Datei die Erweiterung hprof.
haben solltelive, das dem in jmap ähnelt. Wenn dies eingestellt ist, werden nur Objekte mit aktiven Referenzen gedruckt
Sehen wir uns zwei verschiedene Techniken an, um diese Methode zum Erfassen eines Heap-Dumps aufzurufen.
JMX-Client wie JConsole ist die einfachste Möglichkeit, das HotSpotDiagnostic MBean zu verwenden. Wenn JConsole geöffnet und mit einem laufenden Java-Prozess verbunden ist, navigieren Sie zur Registerkarte MBeans und identifizieren Sie die HotSpotDiagnostic, die unter com.sun.management vorhanden ist. Innerhalb der Operationen ist die zuvor erläuterte dumpHeap-Methode zu finden. Zum Ausführen der dumpHeap-Operation werden die Parameter „outputFile“ und „live“ als Textfelder „p0“ und „p1“ verwendet.
Ähnlich wie JConsole kann HotSpotDiagnostic MBean verwendet werden, indem es über ein Programm aus Java-Code aufgerufen wird. Dazu muss eine MBeanServer-Instanz ein MBean in der Anwendung registrieren. Sobald dies abgeschlossen ist, wird eine Instanz eines HotSpotDiagnosticMXBean benötigt und die dumpHeap-Methode dieser Instanz muss aufgerufen werden.
Angenommen, die von Ihnen verwendete Anwendung läuft auf IBM Websphere Application Server. Die Verwaltungskonsole kann Heaps generieren. Wählen Sie zunächst im Navigationsbereich der Verwaltungskonsole „Fehlerbehebung“ und dann „Java-Dumps und -Kerne“ aus. Sobald dies erledigt ist, wählen Sie den Servernamen für denjenigen aus, der den Heap-Dump erstellen soll. Klicken Sie anschließend auf Heap-Dump, um den Heap-Dump für den genannten Server zu erstellen. wsadmin kann auch zum Erstellen von Heap-Dumps verwendet werden.
Das obige ist der detaillierte Inhalt vonJava-Heap-Dump. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!