Beim Umgang mit OOM-Fehlern habe ich viele Websites besucht und Eingaben wiederholt. Zu dieser Zeit hatte ich große Probleme, systematisch Wissen zu erlangen. Also schrieb ich diesen Artikel in der Hoffnung, dass er für diejenigen hilfreich sein würde, die ähnlich kämpfen.
Wenn Sie JVM bereits kennen und wissen möchten, wie Sie mit OOM-Problemen umgehen können, lesen Sie bitte diesen Artikel. [JVM] Lassen Sie uns die OOM-Fehlerantwort (Out Of Memory) herausfordern ** Bitte überprüfen Sie hier, wie es hinzugefügt wurde **
・ JVM? Das weiß ich nicht! Menschen ・ Ingenieure mit denselben Problemen wie OOM -Zerstörungsgott, der einen Prozess startet, ohne das JVM-Protokoll usw. zu setzen.
Die Reparatur einer bestimmten Funktion dauerte ungefähr einen Monat. Nachdem wir die Veröffentlichung getestet und vorbereitet haben, können wir sie veröffentlichen! Zu jener Zeit ** Es ist ein Ereignis aufgetreten, bei dem die in der Überprüfungsumgebung aufgeführten Dienste einmal pro Woche gelöscht wurden. ** ** ** Ich wusste, dass der Grund Out Of Memory (OOM) war, aber ich weiß nicht, warum es passiert ist. Außerdem gibt es keine Leute um mich herum, die mit JVM vertraut sind, und es gibt keine Daten wie Heap Dump (dazu später mehr). Zum Beispiel fühlte ich mich mit meinem Notebook-PC auf einer unbewohnten Insel verlassen.
** Ich habe Wörter wie JVM, GC, Heap gehört, aber ich verstehe die Bedeutung nicht. Ich habe beschlossen, in diesem Artikel zusammenzufassen, was ich gelernt habe, um dieses OOM-Problem zu lösen. ** ** **
Zunächst aus dem Eingabeabschnitt. Es ist unmöglich, ohne das notwendige Wissen zu untersuchen. Hier konzentrieren wir uns darauf zu lernen, wie JVM und GC funktionieren.
Kurz gesagt, es ist die Software, die zum Ausführen von Java-Programmen benötigt wird. Ruby und Scala laufen auch auf JVM. Das Merkmal von JVM ist, dass das Programm unabhängig von der Plattform ausgeführt werden kann. ** Mit anderen Worten, es kann unabhängig von der Betriebssystemumgebung (Windows, Mac, Linux usw.) ausgeführt werden. ** ** **
Der JVM wird beim Start der Betriebssystemspeicherbereich zugewiesen. Dies wird später erklärt, kann jedoch durch eine Startoption (z. B. Java -Xms100m) festgelegt werden.
Die JVM hat die folgende Struktur.
Diese Bereiche werden nachstehend ausführlich beschrieben.
** Kurz gesagt, der Speicherbereich, der vom vom Benutzer erstellten Programm verwendet wird. ** ** ** Mit anderen Worten, der Speicherplatz, in dem in Java-Programmen verwendete Objekte und Arrays gespeichert sind. Ich glaube, ich instanziiere ein Objekt, wenn ich ein Programm ausführe, aber zu diesem Zeitpunkt wird Speicher zugewiesen.
Genau genommen ist der Java-Heap in einen neuen Bereich und einen alten Bereich unterteilt.
** Der Bereich, in dem das neu erstellte Objekt zuerst gespeichert wird ** Selbst im neuen Gebiet ist das Gebiet in Eden und Überlebende unterteilt. Neu erstellte Objekte usw. werden zunächst im Eden-Bereich gespeichert. Wenn der Speicher des Eden-Bereichs voll ist, wird er im Survivor gespeichert (genau genommen "From-Bereich" und "To-Bereich"), um das Objekt zu speichern.
Ich werde es später ausführlich erklären, aber ich möchte, dass Sie es ein wenig in die Ecke Ihres Kopfes stecken. Scavenge GC wird für den neuen Bereich durchgeführt.
** Bereich, in dem langlebige Objekte unter den im neuen Bereich gespeicherten Objekten gespeichert sind. ** ** ** Ein langes Leben ist ein Objekt, das lange Zeit in diesem Prozess verwendet wurde. Beispielsweise ist ein Objekt, das nur in einer Verarbeitungsmethode verwendet wird, ein kurzlebiges Objekt.
puclic hoge() {
Fuga fuga = new fuga();
}
Ich werde es später ausführlich erklären, aber ich möchte, dass Sie es in die Ecke Ihres Kopfes stecken. ** Die vollständige GC wird im alten Bereich durchgeführt. ** ** **
Der Speicherplatz, den die JVM zum Ausführen nativer Bibliotheken verwendet.
Ein Speicherplatz, in dem Klassen- und Methodeninformationen gespeichert sind. Da es zuerst gespeichert wird, ändert sich die Größe nicht wesentlich.
Java-Thread-Stack-Bereich
Ein Mechanismus, der nicht mehr verwendete Objekte löscht.
Zum Beispiel für diejenigen, die das Bild nicht verstehen Stellen Sie sich zunächst ein Reisfeld vor. Sämlinge werden auf den Reisfeldern gepflanzt und wenn sie gewässert werden, werden sie zu Reis. (Bild, das das Objekt erstellt) Nehmen wir an, es gibt einen Typen, der auf dem Weg von den Setzlingen zum Reis durcheinander gerät. (Bild, dass auf das Objekt nicht mehr verwiesen wird) Es ist die Aufgabe des GC, die Person, die versagt hat, automatisch aufzunehmen. Dies wird die Fläche für das Pflanzen neuer Sämlinge vergrößern, was für Reisfeldbesitzer ein willkommener Mechanismus ist.
Um ein Objekt zu werden, das der GC löscht, müssen die folgenden Punkte erfüllt sein. ** - Das Objekt wird von keiner Stelle aus referenziert. ** ** **
Darüber hinaus ist GC grob in zwei Muster unterteilt. Scavenge GC (auch als Copy GC / Minor GC bezeichnet) und Full GC (auch als Major GC bezeichnet).
Scavenge GC Das generierte Objekt wird dem Bereich Neu zugeordnet. ** Wenn der neue Bereich voll ist, wird die GC für den neuen Bereich durchgeführt. ** ** ** Dies wird als Scavenge GC bezeichnet. Scavenge GC löscht die zu löschenden Objekte, und die Objekte, die noch verwendet werden und eine lange Lebensdauer haben, werden in den alten Bereich verschoben. Auf diese Weise wird der neue Bereich gesichert und das neue Objekt wird zur Annahme vorbereitet. Es ist wie eine kurzfristige Gastfamilie.
Full GC ** Wenn der alte Bereich und der parmanente Bereich voll sind, wird die GC für den zukünftigen Bereich durchgeführt. ** ** ** Dies ist Full GC.
Grob gesagt Wenn in einem der oben eingeführten Bereiche nicht genügend Speicher vorhanden ist, verursacht die JVM einen Fehler wegen zu wenig Speicher.
Hier ist es wichtig zu bestimmen, wo das OOM aufgetreten ist. ** Zuallererst sollte das Treffen einer Entscheidung und das Identifizieren des Bereichs das erste sein, was OOM bei der Fehlerbehebung tut! !! !! !! !! ** ** **
Nur die Mindestoptionen, die unbedingt erklärt werden sollten.
-Xms -Xmx
-Xms ist die anfängliche Java-Heap-Größe. Im Allgemeinen gleich -Xmx. -Xmx ist die maximale Java-Heap-Größe. Sie können die obigen Informationen sehen, wenn Sie einen Java-Prozess mit dem folgenden Befehl starten.
ps aux | grep java
・ Überprüfen Sie den GC-Auftrittsstatus und den Speicherverluststatus
-verbose:gc(-Xloggc:Dateipfad hier aufgelistet)、-XX:+PrintGCTimeStamps、-XX:+PrintGCDetails
Durch diese Einstellung werden die Informationen des GC-Protokolls detailliert angezeigt. Wenn Sie das GC-Protokoll des ausgeführten Java-Prozesses anzeigen möchten, überprüfen Sie es mit dem folgenden Befehl.
#Überprüfen Sie den Java-Prozess
jcmd -l
#über<pid>Geben Sie ein, um das GC-Protokoll zu überprüfen
jstat -gcutil -h10 <pid> 10000
-Erhalten eines Heap-Dumps
-XX:+HeapDumpOnOutOfMemoryError
Wenn Sie dies einstellen, wird beim Anhalten bei OOM ein Heap-Dump erfasst. ** Ein Heap-Dump ist wie eine Momentaufnahme des Heap-Status. ** ** ** Da die Heap-Größe an einem bestimmten Punkt erfasst wird, kann die Speichernutzungsrate durch Vergleichen unmittelbar nach dem Start, einen Tag später usw. verglichen werden. Der Übergang und die Ursache sind leicht zu verstehen.
Wenn Sie zu irgendeinem Zeitpunkt aufnehmen möchten, führen Sie den folgenden Befehl aus, um ihn abzurufen.
#Überprüfen Sie den Java-Prozess
jcmd -l
#über<pid>Um einen Heap-Dump zu bekommen
jmap -dump:format=b,file=filename <pid>
Weitere Informationen finden Sie unter diesem Link. http://d.hatena.ne.jp/learn/touch/20090218/p1
Dies ist das Ende der Erklärung des Mechanismus der JVM und des Mechanismus der GC. So viel wie möglich habe ich diesen Artikel geschrieben, damit ich JVM systematisch verstehen und die Details auf anderen Websites untersuchen kann.
Es ist etwas zu lange her, also werde ich es in einem anderen Artikel zusammenstellen.
[JVM] Lassen Sie uns die OOM-Fehlerantwort (Out Of Memory) herausfordern