Inhaltsverzeichnis
Einführung in die Heapdump-Datei
Einführung
Überprüfen Sie die Heap-Nutzungsverteilung
Finden Sie den Zuweisungsthread für große Objekte
Thread-Stapel anzeigen
Heim Java javaLernprogramm So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

May 13, 2023 pm 08:58 PM
java heapdump

Einführung in die Heapdump-Datei

Heap-Dump: Die Heap-Dump-Datei ist eine Binärdatei, die die Verwendung von Objekten im JVM-Heap zu einem bestimmten Zeitpunkt speichert. Die HeapDump-Datei ist eine Momentaufnahme des Java-Stacks zu einem bestimmten Zeitpunkt und eine Art Bilddatei.

Heap-Dump-Fehler (Speicherüberlauf) werden im Allgemeinen aus folgenden Gründen verursacht:

1) Der JVM-Speicher ist zu klein,

2) Das Programm ist nicht streng,

3) Es wird zu viel Müll erzeugt und kann nicht sein recycelt.

Einführung

Nachdem ich das vorherige OOM-Problem überprüft habe, ist das Problem dieses Mal nicht schwerwiegend. Es löst jedoch zum Glück keinen OOM-Alarm aus In der Überprüfung wurde das Dump-Skript zusammengefasst, das bei hoher Heap-Nutzung automatisch jstack und jmap ausführt, sodass wir die problematische Site erfolgreich beibehalten können.

Überprüfen Sie die Heap-Nutzungsverteilung

Nachdem ich die Heapdump-Datei entdeckt hatte, kopierte ich sie sofort auf den lokalen Computer und analysierte sie mit MAT wie folgt:

So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

Offensichtlich scheint es, dass eine Schnittstelle einen sehr großen String zugewiesen hat Objekt, ein String Das Objekt ist etwa 200 MB groß. Wo ist es also zugeordnet?

Finden Sie den Zuweisungsthread für große Objekte

Dieses Zuweisungsverhalten muss von einem bestimmten Thread ausgeführt werden, und der Thread ist der häufigste GC-Root. Sie müssen also nur den GC-Root des Objekts wie folgt finden:

So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

Das große Objekt wurde gefunden. Der entsprechende Zuordnungsthread ist http-nio-8088-exec-6 wie folgt:

So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

Thread-Stapel anzeigen

Wie überprüfe ich, was dieser Thread tut? Nachdem ich eine Weile in MAT herumgesucht hatte, fiel mir ein, dass jstack in unserem Dump-Skript aufgezeichnet war führt eine JSON-Serialisierung durch, aber ich habe sorgfältig nachgesehen. Nach einer Weile wurde der Controller der relevanten Schnittstelle nicht gefunden. Dies liegt daran, dass der Thread die Ausführung der Logik im Controller abgeschlossen hat und dann das große Objekt zurückgegeben hat, das zugewiesen wurde, als die Schnittstelle antwortete die Daten.

Da es jedoch keinen Geschäftscode im Thread-Stack gibt, ist es unmöglich herauszufinden, bei welcher Schnittstelle das Problem auftritt. . . So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

Überprüfen Sie das Zugriffsprotokoll.

Da die Schnittstelle zum Zuweisen großer Objekte definitiv sehr langsam sein wird, habe ich das Zugriffsprotokoll von Tomcat wie folgt überprüft:

Schließlich habe ich die problematische Schnittstelle gefunden Wird zum Abfragen von Produktdaten verwendet. Ja, wenn Sie 3 eingeben, werden alle Produkte abgefragt, die mit 3 beginnen, und es sind mehr als 200.000 Daten vorhanden. Die Lösung des Problems ist sehr einfach. Fügen Sie einfach ein Limit hinzu und fertig.

Überprüfung des FehlerbehebungsprozessesSo analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

Allerdings hatte ich schon immer die Angewohnheit, dass ich nach der Lösung eines Problems darüber nachdenke, wie viel Glück bei der Problemlösung dabei war.

Wenn Sie häufig technische Artikel zur Fehlerbehebung lesen, werden Sie viele Artikel finden, in denen die Ursache des Problems plötzlich lokalisiert wird. Dies kann daran liegen, dass Sie plötzlich einen Hinweis entdeckt haben, oder Sie können ihn anhand des Codes erkennen Sie können es erraten. Ich denke, dieser Fehlerbehebungsprozess erfordert viel Glück. Ich hoffe, dass das Problem durch jahrelange Ansammlung theoretischer Grundlagen und den kompetenten Einsatz von Diagnosetools gefunden werden kann.

Das obige Problem kann über das Zugriffsprotokoll lokalisiert werden, was ein gewisses Maß an Glück bringt, da das Speicherproblem dieses Mal nicht extrem ist. Wenn das Anforderungsvolumen dieser Schnittstelle groß ist, werden mehrere FGCs sofort ausgelöst, was zu einer Verlangsamung führt Andere Schnittstellen herunterfahren Es gibt keine Möglichkeit herauszufinden, welche Schnittstelle das Problem verursacht!

Ich denke, theoretisch sollte es einen Thread-Stack und Parameter auf dem Thread-Stack in der Java-Heap-Datei geben. Da Threads Objekte und Parameter auch Objekte sind, sollten sie sich alle im Heap befinden, also habe ich eine freie Zeit gefunden , ich erforsche das Tool MAT erneut.

MAT Thread-Stapel anzeigen

Nachdem ich eine Weile herumgesucht hatte, fand ich eine Schaltfläche zum Anzeigen von Thread-Informationen wie folgt:

Suchen Sie den zuvor erwähnten Thread http-nio-8088-exec-6 und erweitern Sie ihn. Sie können den Thread-Stack und die Parameter auf dem Stack wie folgt finden:

So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

Dadurch wird das Request-Parameterobjekt der Anfrage gefunden. Nachdem Sie das Request-Objekt mehrmals erweitert haben, können Sie die Schnittstellen-URL-Informationen wie folgt finden :

So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

VisualVM View Thread Stack

Angesichts der Tatsache, dass viele Schüler es gewohnt sind, VisualVM zum Analysieren von Heapdumps zu verwenden, erfahren Sie hier, wie Sie VisualVM verwenden. So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

Laden Sie zunächst die Heapdump-Datei wie folgt:

So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

Wählen Sie dann das entsprechende Objekt aus, klicken Sie mit der rechten Maustaste und wählen Sie „In Threads auswählen“ wie folgt aus:

So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

Nachdem Sie den Thread-Stapel gefunden haben, suchen Sie das Anforderungsobjekt, das Sie anzeigen möchten, und klicken Sie zur Eingabe wie folgt:

So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

Erweitern Sie auf ähnliche Weise das Request-Objekt. Danach finden Sie die URL-Informationen wie folgt:

So analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat

Das obige ist der detaillierte Inhalt vonSo analysieren Sie die Heapdump-Datei schnell, nachdem Java sie erhalten hat. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

See all articles