Kesalahan OutOfMemory: Had Overhead GC Melebihi

1. Gambaran keseluruhan

Ringkasnya, JVM menguruskan pembebasan memori ketika objek tidak lagi digunakan; proses ini dipanggil Garbage Collection (GC).

The GC Overhead Melebihi Had kesilapan adalah satu dari keluarga java.lang.OutOfMemoryError dan petunjuk sumber (memori) keletihan.

Dalam artikel ringkas ini, kita akan melihat apa yang menyebabkan java.lang.OutOfMemoryError: Had Overhead GC Melebihi ralat dan bagaimana ia dapat diselesaikan.

2. Had Overhead GC Melebihi Ralat

OutOfMemoryError adalah subkelas java.lang.VirtualMachineError ; ia dilemparkan oleh JVM ketika menghadapi masalah yang berkaitan dengan penggunaan sumber. Lebih khusus lagi, ralat berlaku apabila JVM menghabiskan terlalu banyak masa untuk melakukan Pengumpulan Sampah dan hanya dapat memperoleh kembali ruang timbunan yang sangat sedikit.

Menurut dokumen Java, secara lalai, JVM dikonfigurasi untuk membuang kesalahan ini jika proses Java menghabiskan lebih dari 98% waktunya melakukan GC dan ketika hanya kurang dari 2% timbunan dipulihkan dalam setiap larian. Dengan kata lain, ini bermaksud bahawa aplikasi kita telah menghabiskan hampir semua memori yang ada dan Pengumpul Sampah telah menghabiskan terlalu banyak masa untuk membersihkannya dan gagal berulang kali.

Dalam keadaan ini, pengguna mengalami kelambatan aplikasi yang melampau. Operasi tertentu, yang biasanya selesai dalam milisaat, memerlukan lebih banyak masa untuk diselesaikan. Ini kerana CPU menggunakan seluruh kapasitasnya untuk Pengumpulan Sampah dan oleh itu tidak dapat melakukan tugas lain.

3. Kesalahan dalam Tindakan

Mari lihat sekeping kod yang melemparkan java.lang.OutOfMemoryError: Had Overhead GC Melebihi.

Kita boleh mencapainya, misalnya, dengan menambahkan pasangan nilai-kunci dalam gelung yang tidak dapat dihentikan:

public class OutOfMemoryGCLimitExceed { public static void addRandomDataToMap() { Map dataMap = new HashMap(); Random r = new Random(); while (true) { dataMap.put(r.nextInt(), String.valueOf(r.nextInt())); } } }

Apabila kaedah ini dipanggil, dengan argumen JVM sebagai -Xmx100m -XX: + UseParallelGC ( ukuran timbunan Java ditetapkan ke 100MB dan Algoritma GC adalah ParallelGC), kita mendapat ralat java.lang.OutOfMemoryError: Had Overhead GC . Untuk mendapatkan pemahaman yang lebih baik mengenai Algoritma Pengumpulan Sampah yang berbeza, kita dapat melihat tutorial Asas Pengumpulan Sampah Java Oracle.

Kami akan mendapat java.lang.OutOfMemoryError: Had Overhead GC Melebihi ralat dengan cepat dengan menjalankan arahan berikut dari akar projek:

mvn exec:exec

Perlu juga diperhatikan bahawa dalam beberapa situasi, kita mungkin mengalami kesalahan ruang timbunan sebelum mengalami kesalahan GC Overhead Limit Melebihi .

4. Menyelesaikan Kesalahan Had Overhead GC Melebihi Ralat

Penyelesaian yang ideal adalah mencari masalah yang mendasari aplikasi dengan memeriksa kod untuk kebocoran memori.

Soalan berikut perlu ditangani:

  • Apakah objek dalam aplikasi yang menempati sebahagian besar timbunan?
  • Di bahagian sumber kod mana objek-objek ini diperuntukkan?

Kami juga boleh menggunakan alat grafik automatik seperti JConsole yang membantu mengesan masalah prestasi dalam kod termasuk java.lang.OutOfMemoryErrors.

Langkah terakhir adalah meningkatkan saiz timbunan dengan mengubah konfigurasi pelancaran JVM. Sebagai contoh, ini memberi ruang timbunan 1GB untuk aplikasi Java:

java -Xmx1024m com.xyz.TheClassName

Walau bagaimanapun, ini tidak akan menyelesaikan masalah jika terdapat kebocoran memori dalam kod aplikasi yang sebenarnya. Sebaliknya, kami hanya akan menangguhkan ralat. Oleh itu, lebih disarankan untuk menilai semula penggunaan memori aplikasi secara menyeluruh.

5. Kesimpulan

Dalam tutorial ini, kami memeriksa java.lang.OutOfMemoryError: Had Overhead GC Melebihi dan sebab-sebab di sebalik itu.

Seperti biasa, kod sumber yang berkaitan dengan artikel ini boleh didapati di GitHub.