Rumah >Java >JavaSoalan temu bual >Temu bual dengan kumpulan tertentu: Jika anda menemui OOM dalam talian, bagaimanakah anda harus menyelesaikan masalah itu? Bagaimana untuk menyelesaikannya? Apakah pilihan?
Temu bual dengan kumpulan tertentu: Jika anda menemui OOM dalam talian, bagaimanakah anda harus menyelesaikan masalah itu? Bagaimana untuk menyelesaikannya? Apakah pilihan?
OOM bermakna terdapat kelemahan dalam program, yang mungkin disebabkan oleh kod atau konfigurasi parameter JVM. Artikel ini bercakap dengan pembaca tentang cara menyelesaikan masalah apabila proses Java mencetuskan OOM.
Ia sering dikatakan kagum dengan persekitaran pengeluaran, dan menyelesaikan masalah dengan cepat juga merupakan tanda kagum
Kenapa OOM
OOM bermaksud "Out Of Memory" ingatan sudah habis. Apabila JVM tidak mempunyai memori yang mencukupi untuk memperuntukkan ruang untuk objek, dan pengumpul sampah tidak mempunyai ruang untuk mengitar semula, ia akan membuang ralat ini
Mengapa OOM berlaku secara amnya disebabkan oleh masalah ini
Terlalu sedikit peruntukan : Memori permulaan JVM adalah kecil, dan perniagaan menggunakan banyak memori; atau peruntukan memori dalam kawasan JVM yang berbeza adalah tidak munasabah
Kerentanan kod: objek tertentu sering digunakan, tetapi tidak dikeluarkan selepasnya tidak digunakan lagi, mengakibatkan kehabisan daya ingatan
Memori bocor: Memori yang telah dipohon tidak dilepaskan menyebabkan mesin maya tidak dapat menggunakan memori itu semula . Kerana pemohon tidak lagi digunakan, tetapi mesin maya tidak boleh diperuntukkan kepada orang lain
Memori limpahan: Memori yang digunakan melebihi saiz memori yang boleh diberikan oleh JVM pada masa ini, ia dipanggil limpahan
Kebocoran ingatan berterusan, dan akhirnya ia mesti Akan melimpah, kedua-duanya berkaitan sebab musabab
OOM Biasa
Jenis OOM yang lebih biasa adalah seperti berikut
java.lang.OutOfMemoryErspace Limpahan penjanaan kekal Java7 (kawasan kaedah), yang digunakan untuk menyimpan data seperti maklumat kelas, pemalar, pembolehubah statik dan kod yang disusun oleh pengkompil tepat dalam masa yang telah dimuatkan oleh mesin maya. Setiap kali kelas dimuatkan buat kali pertama, metadata akan disimpan dalam generasi kekal Biasanya ia berlaku dalam sejumlah besar objek Kelas atau halaman JSP, atau ia disebabkan oleh menggunakan teknologi proksi dinamik CgLib.
[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.
🎜通过查看 JVM 内存刨制菊行情况,可以判断内存分配是否合理🎜
Selain itu, anda boleh melihat objek yang paling banyak menggunakan sumber semasa JVM sedang berjalan, jmap -histo:live 15162 | morejmap -histo:live 15162 | more
Senarai objek memori JVM diisih mengikut saiz memori yang diduduki oleh objek
instance: bilangan instance
bait: unit byte
nama kelas: nama kelas
Jelas lihatCustomObjTest contoh objek dan mengambil terlalu banyak memoriMalangnya, penyelesaiannya mempunyai batasan kerana ia hanya boleh Menyelesaikan masalah yang objek menduduki terlalu banyak memoridi mana "[" mewakili tatasusunan, contohnya, "[C" mewakili tatasusunan Char dan "[B" mewakili tatasusunan Byte. Jika memori tatasusunan mengambil terlalu banyak, kami tidak tahu objek mana yang memegangnya, jadi kami perlu membuang memori untuk analisis luar talian
jmap -histo:live Laksanakan arahan ini, JVM akan mencetuskan GC dahulu, dan kemudian kumpulkan statistik
Analisis fail buang Fail Dump ialah imej memori proses Java, di mana Ia terutamanya termasuk
maklumat sistem
, sifat mesin maya,
buang benang lengkap
,
status semua kelas dan objek🎜 dan maklumat lain🎜🎜Apabila program mempunyai limpahan memori atau GC pengecualian, disyaki JVM telah berlaku🎜kebocoran memori 🎜, maka kita boleh mengeksport fail Dump untuk analisis🎜🎜Tambah parameter berikut pada konfigurasi parameter permulaan JVM🎜
Jika anda menghadapi limpahan memori JVM dalam talian, anda boleh menyelesaikan masalah dalam langkah berikut
jmap -heap Semak sama ada peruntukan memori terlalu keciljmap -heap 查看是否内存分配过小
jmap -histo 查看是否有明显的对象分配过多且没有释放情况
jmap -dump
jmap -histo Semak sama ada terdapat apa-apa yang jelas peruntukan objek Terlalu banyak dan tiada pelepasan
jmap -dump Eksport gambar memori semasa JVM dan gunakan alat seperti JDK atau MAT untuk menganalisis syot kilat 🎜🎜🎜🎜Jika masalah tidak dapat ditemui di atas, anda perlu menyemak sama ada aplikasi sentiasa mencipta sumber, seperti rangkaian Sambungan atau benang boleh menyebabkan sumber sistem kehabisan. 🎜🎜🎜
Atas ialah kandungan terperinci Temu bual dengan kumpulan tertentu: Jika anda menemui OOM dalam talian, bagaimanakah anda harus menyelesaikan masalah itu? Bagaimana untuk menyelesaikannya? Apakah pilihan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!