[JAVA] [JVM] Lassen Sie uns die OOM-Fehlerantwort (Out Of Memory) herausfordern

Einführung

Die Grundkenntnisse von JVM wurden in diesem Artikel vorgestellt. [JVM] OOM (nicht genügend Speicher) Erforderliche Kenntnisse zur Fehlerbehebung

Ich werde von nun an auf bestimmte OOM-Lösungen eingehen.

Ausgabe

Wenn Sie von hier aus tatsächlich auf ein OOM-Problem stoßen, lernen Sie die Maßnahmen zur Lösung dieses Problems. Hier stellen wir auch Tools vor, die konkret eingesetzt werden können. (Informationen zur Verwendung finden Sie unter dem Link.)

Detaillierte Ereignisse des Problems wurden dieses Mal angesprochen

Um die diesmal aufgetretenen Probleme zusammenzufassen: Es war ein Ereignis, bei dem der Java-Prozess einmal pro Woche unterbrochen wurde. Als ich die Speichernutzungsrate mit dem Befehl sar überprüfte, wurde sie kurz vor dem Herunterfallen zu etwa 100% verwendet. Das JVM-Absturzprotokoll enthielt das Wort OOM.

Das Folgende ist eine Zusammenfassung der Umfragerichtlinie, der Umfragemethode, der zu beachtenden Punkte usw. Als ich nachforschte, wusste ich nicht, wie ich nachforschen sollte, und ich vermisste wichtige Informationen. Ich habe falsche Daten seltsam interpretiert.

Die hier beschriebene Speer-Vermessungsmethode ist also die beste Methode, die ich mir derzeit vorstellen kann.

Umfragepolitik

Möglicherweise möchten Sie in der folgenden Reihenfolge nachforschen.

  1. Überprüfen Sie hs_err_ .log, um das Problem einzugrenzen (dies kann erheblich eingegrenzt werden).
  2. Überprüfen Sie den Heap-Status aus dem GC-Protokoll
  3. Wenn es ein Problem mit dem Java-Heap gibt, identifizieren Sie das Problem anhand des Heap-Dumps
  4. Wenn es ein Problem mit Nicht-Heap gibt, identifizieren Sie das Problem anhand der Anzahl der Threads
  5. Verdacht auf OOM Killer, wenn die Speichernutzung aus anderen als den oben genannten Gründen zunimmt

** Wenn Sie zuerst mit OOM-Problemen umgehen, sind die Probleme möglicherweise nicht linear miteinander verflochten Es ist notwendig, eine stählerne Mentalität zu haben, die ruhig Hypothesen formuliert und sie stetig überprüft. ** ** **

1. Überprüfen Sie hs_err_ .log, um das Problem einzugrenzen (dies kann erheblich eingegrenzt werden).

** Wenn Sie sich dieses Protokoll ansehen, können Sie das OOM-Problem erheblich eingrenzen. ** ** ** Wenn ich die Überprüfung der Hypothese danach wiederhole, denke ich, dass die Geschwindigkeit, um die Ursache zu erreichen, viel schneller sein wird. Bitte überprüfen Sie dies mit größter Sorgfalt. (Ich habe gekämpft, ohne das zuerst zu wissen)

Dieses Protokoll ist übrigens das Protokoll, das ausgegeben wird, wenn die JVM abstürzt. Wenn Sie in den JVM-Startoptionen nichts festlegen, wird es in das aktuelle Verzeichnis ausgegeben. Wenn Sie das Ausgabeziel angeben möchten, können Sie die folgenden Startoptionen festlegen.

java -XX:ErrorFile=/var/log/java/java_error%p.log

Lesen Sie hs_err_ .log

Lesen Sie nun hs_err_ .log, um das Problem zu identifizieren. Wenn Sie den Inhalt der Protokolldatei öffnen, finden Sie die folgende Beschreibung. ** Bitte beziehen Sie sich auf die Beschreibung, da dies das Problem bis zu einem gewissen Grad eingrenzen kann. ** ** **

-Es gibt ein Problem mit dem Java-Heap

Exception in thread "main": java.lang.OutOfMemoryError: Java heap space

Java heap space indicates that an object could not be allocated in the Java heap ein. Ich konnte dem Java-Heap-Bereich kein Objekt zuordnen! Kann interpretiert werden als Das heißt, die Kapazität des Java-Heap-Bereichs ist gering. → Durch Erhöhen der Kapazität wird das Problem gelöst.

the message might be an indication that the application is unintentionally holding references to objects Es gibt auch. Es wurde ständig auf ein Objekt verwiesen, und der Speicher wird allmählich leer, ohne dass der GC gelöscht werden muss! Kann interpretiert werden als Das ist also ein Speicherverlust → Das Problem wird gelöst, indem ein Heap-Dump erstellt, die allmählich zunehmenden Objekte identifiziert und die Quelle gesammelt werden. Siehe ** 3. Wenn ein Problem mit dem Java-Heap vorliegt, identifizieren Sie das Problem anhand des Heap-Dumps ** unten

-Es gibt ein Problem mit dem permanenten Heap

Exception in thread "main": java.lang.OutOfMemoryError: PermGen space

PermGen space indicates that the permanent generation is full. ein. Es gibt nicht genug permanenten Bereich! Kann interpretiert werden als Mit anderen Worten, es ist erforderlich, einen ausreichenden Bereich mit der Option -XX: MaxPermSize zu sichern.

Außerdem werden in diesem Bereich statische Variablen und die Klasse gespeichert, die zuerst in den Klassenlader geladen wird.

-Es gibt ein Problem mit dem Java-Heap.

Exception in thread "main": java.lang.OutOfMemoryError: Requested array size exceeds VM limit

Requested array size exceeds VM limit indicates that the application (or APIs used by that application) attempted to allocate an array that is larger than the heap size. ein. Das Array konnte im Java-Heap-Bereich nicht zugeordnet werden! Kann interpretiert werden als Das heißt, die Kapazität des Java-Heap-Bereichs ist gering. → Durch Erhöhen der Kapazität wird das Problem gelöst. Alternativ kann das Problem gelöst werden, indem ein Heap-Dump erstellt, die allmählich ansteigenden Objekte identifiziert und die Quelle abgerufen werden. Siehe ** 3. Wenn ein Problem mit dem Java-Heap vorliegt, identifizieren Sie das Problem anhand des Heap-Dumps ** unten

-Es gibt ein Problem mit dem C-Heap

Exception in thread "main": java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space?

the HotSpot VM code reports this apparent exception when an allocation from the native heap failed and the native heap might be close to exhaustion. ein. Dem nativen Heap (C-Heap) wurde kein Speicher zugewiesen! Kann interpretiert werden als Übrigens war es dieses Problem, mit dem ich mich befasst habe. Wenn Sie auf dieses Problem stoßen, können Sie grundsätzlich davon ausgehen, dass die Ursache die Anzahl der Threads ist. Also ** 4. Wenn Sie ein Problem mit Nicht-Heap haben, siehe ** Identifizieren Sie das Problem anhand der Anzahl der Threads **

Weitere Informationen finden Sie auf der folgenden Website.

Ich denke, die bisherigen Informationen haben das Problem in gewissem Maße eingegrenzt. Von hier aus wandelt sich das Problem von der Hypothese zur Tatsache.

2. Überprüfen Sie den Heap-Status aus dem GC-Protokoll

Wie im Eingabeabschnitt erwähnt, setzen Sie -verbose: gc als Startoption. Sie können das GC-Protokoll erhalten. Wenn Sie sich dieses Protokoll ansehen, können Sie sehen, wie der Heap-Bereich aufgrund der Ausführung von Minor GC und Major GC schwankt. ** GC Viewer ** ist sehr nützlich für die Visualisierung und Anzeige.

Dieser Artikel ist nützlich für die Verwendung und Anzeige des Tools https://qiita.com/i_matsui/items/aabbdaa169c6ae51ecb3

3. Wenn es ein Problem mit dem Java-Heap gibt, identifizieren Sie das Problem anhand des Heap-Dumps

Durch Visualisierung und Vergleich der Ergebnisse von Heap-Dumps mit Memory Analyzer Sie werden sehen, ob es wirklich ein Problem mit dem Java-Heap gibt. Die folgenden Artikel sind sehr nützlich für die Verwendung von Memory Analyzer.

Die spezifische Methode ist

Wenn Sie wissen, welches Objekt das Problem ist, ändern Sie die Quelle. Wenn der Heap-Bereich jedoch nicht ausreicht, können Sie ihn vergrößern.

4. Wenn es ein Problem mit Nicht-Heap gibt, identifizieren Sie das Problem anhand der Anzahl der Threads

Durch Vergleichen der Thread-Dumps kann die Anzahl der Threads verglichen werden.

#PID-Bestätigung
jcmd -l

#Holen Sie sich Thread Dump
jstack <pid> > threaddump.txt

Mithilfe von jconsole können Sie auch den Übergang der Anzahl der Threads visualisieren Sie können sehen, ob die Anzahl der Threads proportional zur Zeit zunimmt.

Ich habe es nicht benutzt, aber ich werde es vorstellen, weil es sehr nützlich zu sein scheint. https://github.com/irockel/tda

Mit dem folgenden Befehl können Sie die Anzahl der Threads und die Speichernutzung ermitteln, um zu vergleichen, ob sie mit der Zeit zunehmen.

ps auxww -L | grep -e java -e PID | grep -v grep

Ich habe auf diesen Artikel verwiesen. http://d.hatena.ne.jp/rx7/20101219/p1

Anfrage: Ich denke, es gibt andere bessere Möglichkeiten. Bitte lassen Sie es mich wissen, wenn Sie es wissen.

5. Verdacht auf OOM Killer, wenn die Speichernutzung aus anderen als den oben genannten Gründen zunimmt

Linux-Spezifikationen ~ Cache ~

Eine der Ideen von Linux ist ein Mechanismus zur aktiven Nutzung des freien Speichers. Der Ärger davon ist mit dem Befehl ps nicht sichtbar. Wenn Sie sich beispielsweise die Speichernutzung eines Prozesses mit ps aux ansehen, verwendet der Java-Prozess 30% Speicher. Betrachtet man jedoch die Nutzungsrate des gesamten Speichers mit sar -r 1, so beträgt sie ungefähr 90%.

In diesem Fall wird es wahrscheinlich zum Zwischenspeichern verwendet. Übrigens wurden zu meiner Zeit auch etwa 60% des Speichers für den Seiten-Cache verwendet.

#Leeren Sie den gesamten Seitencache
# echo 1 > /proc/sys/vm/drop_caches

Sie können den Seitencache mit der oben beschriebenen Methode löschen, dies ist jedoch subtil, da auch der erforderliche Cache gelöscht wird. Im schlimmsten Fall löst die regelmäßige Ausführung mit cron das Problem, dass Speicher für den Seitencache verwendet wird.

Natürlich sollten Sie auch untersuchen, warum Seiten zwischengespeichert werden. Sie können vermuten, dass eine große Anzahl von Protokollen ausgegeben wird (E / A erfolgt).

Die folgenden Artikel sind hilfreich https://tech.mercari.com/entry/2015/07/16/170310

Linux-Spezifikationen ~ OOM Killer ~

damit. In Linux lauert ein Mörder. Um Panik zu vermeiden, wenn Linux nicht mehr genügend Arbeitsspeicher hat Es gibt eine Spezifikation, um einen Prozess, der Speicher verwendet, gewaltsam zu beenden.

Wenn ein Prozess von OOM Killer beendet wird, wird der abgebrochene Prozess in die folgende Datei ausgegeben.

less /var/log/messages

02:53:58 xxxxx1 kernel: Out of memory: Killed process 28036, UID 80, (xmllint).

Auch das Protokoll, das angezeigt wird, wenn die JVM abstürzt, die PID von hs_err_ .log, Wenn die getötete PID unter / var / log / messages übereinstimmt, wissen Sie, dass sie von OOM Killer getötet wurde.

Die folgenden Artikel sind hilfreich. https://blog.ybbo.net/2013/07/10/oom-killer%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

Dinge, die Sie bei der Untersuchung beachten sollten

-Wenn zwischen der lokalen Umgebung und der Verifizierungsumgebung ein Umweltunterschied besteht, kann die Reproduktion möglicherweise nicht durchgeführt werden. Das Verhalten ändert sich je nach Betriebssystem wie Linux (Weil es möglicherweise ein anderes Problem als den Java-Prozess gibt)

・ Führen Sie keine Umfragen ohne Hypothesen oder Richtlinien durch Ich denke, das ist das Wichtigste. Während ich recherchiere, recherchiere ich verschiedene Orte, die mich interessieren, und schaue mir Grafiken an. Es ist fast bedeutungslos, also solltest du aufhören. Ich mache es manchmal.

Zusammenfassung

Wir haben zusammengefasst, wie Sie bestimmte Probleme identifizieren, wenn OOM-Probleme auftreten, und wie Sie sie lösen können. Ich hoffe, es hilft Menschen, die unter OOM-Problemen leiden, wie ich.

Da ich gerade zusammengefasst habe, was ich untersucht habe, sind andere als die hier vorgestellten Methoden Ich denke, es gibt mehr Perspektiven. Wenn Sie es wissen, lassen Sie es mich bitte wissen.

Recommended Posts

[JVM] Lassen Sie uns die OOM-Fehlerantwort (Out Of Memory) herausfordern
Cloud 9 hat nicht genügend Speicher: Rails-Tutorial-Memorandum