Heim >
Java >
JavaInterview Fragen >
Interview mit einer bestimmten Gruppe: Wie sollten Sie das Problem beheben, wenn Sie online auf OOM stoßen? Wie kann man es lösen? Welche Optionen?
Interview mit einer bestimmten Gruppe: Wie sollten Sie das Problem beheben, wenn Sie online auf OOM stoßen? Wie kann man es lösen? Welche Optionen?
OOM bedeutet, dass im Programm eine Schwachstelle vorliegt, die durch den Code oder die JVM-Parameterkonfiguration verursacht werden kann. In diesem Artikel erfahren die Leser, wie sie Fehler beheben können, nachdem ein Java-Prozess OOM ausgelöst hat.
Es wird oft gesagt, dass man Ehrfurcht vor der Produktionsumgebung hat, und das schnelle Lösen von Problemen ist auch ein Zeichen der Ehrfurcht
Warum OOM
OOM steht für „Out Of Memory“, was bedeutet Der Speicher ist erschöpft. Wenn die JVM nicht über genügend Speicher verfügt, um dem Objekt Speicherplatz zuzuweisen, und der Garbage Collector keinen Speicherplatz zum Recyceln hat, wird dieser Fehler ausgegeben
Warum tritt OOM auf? Dies wird im Allgemeinen durch diese Probleme verursacht Zuweisung: Der JVM-Initialisierungsspeicher ist klein und das Unternehmen verwendet viel Speicher. Oder die Zuweisung von Speicher in verschiedenen JVM-Bereichen ist unangemessen. Code-Schwachstelle: Ein bestimmtes Objekt wird häufig beantragt, aber danach nicht freigegeben wird nicht mehr verwendet, was zu einer Speichererschöpfung führt
Speicherverlust: Der beantragte Speicher wird nicht freigegeben, sodass die virtuelle Maschine den Speicher zu diesem Zeitpunkt nicht mehr verwenden kann . Da der Antragsteller nicht mehr verwendet wird und von der virtuellen Maschine nicht anderen zugewiesen werden kann
Speicherüberlauf: Der verwendete Speicher überschreitet die Speichergröße, die die JVM bereitstellen kann. Dies wird als Überlauf bezeichnet Wenn weiterhin ein Speicherverlust besteht und er schließlich überlaufen muss, stehen die beiden in einem kausalen Zusammenhang.
Gemeinsame OOM-Typen sind die folgenden: Überlauf der permanenten Java7-Generierung (Methodenbereich), der zum Speichern von Daten wie Klasseninformationen, Konstanten, statischen Variablen und vom Just-in-Time-Compiler kompiliertem Code verwendet wird, die von der virtuellen Maschine geladen wurden. Wenn eine Klasse zum ersten Mal geladen wird, werden Metadaten in der permanenten Generation gespeichert. Normalerweise treten sie in einer großen Anzahl von Klassenobjekten oder JSP-Seiten auf oder werden durch die Verwendung der dynamischen Proxy-Technologie von CgLib verursacht.
[xxx@xxx ~]# jmap -heap 15162
Attaching to process ID 15162, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40 # 最小堆使用比例
MaxHeapFreeRatio = 70 # 最大堆可用比例
MaxHeapSize = 482344960 (460.0MB) # 最大堆空间大小
NewSize = 10485760 (10.0MB) # 新生代分配大小
MaxNewSize = 160759808 (153.3125MB) # 最大新生代可分配大小
OldSize = 20971520 (20.0MB) # 老年代大小
NewRatio = 2 # 新生代比例
SurvivorRatio = 8 # 新生代与 Survivor 比例
MetaspaceSize = 21807104 (20.796875MB) # 元空间大小
CompressedClassSpaceSize = 1073741824 (1024.0MB) # Compressed Class Space 空间大小限制
MaxMetaspaceSize = 17592186044415 MB # 最大元空间大小
G1HeapRegionSize = 0 (0.0MB) # G1 单个 Region 大小
Heap Usage: # 堆使用情况
New Generation (Eden + 1 Survivor Space): # 新生代
capacity = 9502720 (9.0625MB) # 新生代总容量
used = 4995320 (4.763908386230469MB) # 新生代已使用
free = 4507400 (4.298591613769531MB) # 新生代剩余容量
52.56726495150862% used # 新生代使用占比
Eden Space:
capacity = 8454144 (8.0625MB) # Eden 区总容量
used = 4029752 (3.8430709838867188MB) # Eden 区已使用
free = 4424392 (4.219429016113281MB) # Eden 区剩余容量
47.665996699370154% used # Eden 区使用占比
From Space: # 其中一个 Survivor 区的内存分布
capacity = 1048576 (1.0MB)
used = 965568 (0.92083740234375MB)
free = 83008 (0.07916259765625MB)
92.083740234375% used
To Space: # 另一个 Survivor 区的内存分布
capacity = 1048576 (1.0MB)
used = 0 (0.0MB)
free = 1048576 (1.0MB)
0.0% used
tenured generation: # 老年代
capacity = 20971520 (20.0MB)
used = 10611384 (10.119804382324219MB)
free = 10360136 (9.880195617675781MB)
50.599021911621094% used
10730 interned Strings occupying 906232 bytes.
Nach dem Login kopieren
🎜通过查看 JVM 内存分配以及运行时使用情况,可以判断内存分配是否合理🎜
Darüber hinaus können Sie die ressourcenintensivsten Objekte anzeigen, während die JVM ausgeführt wird, jmap -histo:live 15162 | mehrjmap -histo:live 15162 | more
JVM-Speicherobjektliste wird nach der vom Objekt belegten Speichergröße sortiert
instances: Anzahl der Instanzen
bytes: unit byte
class name: class name
Natürlich sieheCustomObjTest Objektinstanz und beansprucht zu viel SpeicherLeider weist die Lösung Einschränkungen auf weil es nur das Problem beheben kann, dass Objekte zu viel Speicher belegenwobei „[“ beispielsweise ein Array darstellt, „[C“ ein Char-Array darstellt und „[B“ ein Byte-Array darstellt. Wenn der Array-Speicher zu viel beansprucht, wissen wir nicht, welche Objekte ihn enthalten, also müssen wir den Speicher für die Offline-Analyse sichern
jmap -histo:live Führen Sie diesen Befehl aus. Die JVM löst zuerst GC aus und sammelt dann Statistiken Speicherbild des Java-Prozesses, in dem es hauptsächlich
Systeminformationen, Eigenschaften der virtuellen Maschine, vollständiger Thread-Dump, Status aller Klassen und Objekte und andere Informationen
Wenn ein Programm einen Speicherüberlauf oder GC hat Ausnahme: Es besteht der Verdacht, dass ein JVM-Speicherleck aufgetreten ist. Dann können wir die Dump-Datei zur Analyse exportieren. Fügen Sie der JVM-Startparameterkonfiguration die folgenden Parameter hinzu
Wenn Sie online auf einen JVM-Speicherüberlauf stoßen, können Sie das Problem mit den folgenden Schritten beheben
jmap -heap Überprüfen Sie, ob die Speicherzuweisung zu klein istjmap -heap 查看是否内存分配过小
jmap -histo 查看是否有明显的对象分配过多且没有释放情况
jmap -dump
jmap -dump Exportieren Sie den aktuellen Speicher-Snapshot der JVM und analysieren Sie den Snapshot mit Tools wie JDK oder MAT. 🎜🎜🎜🎜Wenn das Problem oben nicht lokalisiert werden kann, müssen Sie es überprüfen Ob die Anwendung ständig Ressourcen erstellt, z. B. Netzwerkverbindungen oder Threads, kann dazu führen, dass die Systemressourcen erschöpft werden. 🎜🎜🎜
Das obige ist der detaillierte Inhalt vonInterview mit einer bestimmten Gruppe: Wie sollten Sie das Problem beheben, wenn Sie online auf OOM stoßen? Wie kann man es lösen? Welche Optionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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