OutOfMemoryError: Batas Overhead GC Terlampaui

1. Ikhtisar

Sederhananya, JVM akan mengosongkan memori saat objek tidak lagi digunakan; proses ini disebut Pengumpulan Sampah (GC).

The GC Overhead Melebihi Batas kesalahan adalah salah satu dari keluarga java.lang.OutOfMemoryError dan merupakan indikasi dari sumber daya (memori) kelelahan.

Dalam artikel singkat ini, kita akan melihat apa yang menyebabkan error java.lang.OutOfMemoryError: GC Overhead Limit Exceeded dan bagaimana cara mengatasinya.

2. Kesalahan Melebihi Batas Overhead GC

OutOfMemoryError adalah subclass dari java.lang.VirtualMachineError ; itu dilemparkan oleh JVM ketika menemui masalah yang berkaitan dengan pemanfaatan sumber daya. Lebih khusus lagi, kesalahan terjadi saat JVM menghabiskan terlalu banyak waktu untuk melakukan Pengumpulan Sampah dan hanya mampu merebut kembali sedikit ruang tumpukan.

Menurut dokumen Java, secara default, JVM dikonfigurasi untuk menampilkan kesalahan ini jika proses Java menghabiskan lebih dari 98% waktunya untuk melakukan GC dan ketika hanya kurang dari 2% dari heap yang dipulihkan dalam setiap proses. Dengan kata lain, ini berarti aplikasi kita telah menghabiskan hampir semua memori yang tersedia dan Pengumpul Sampah telah menghabiskan terlalu banyak waktu untuk mencoba membersihkannya dan gagal berulang kali.

Dalam situasi ini, pengguna mengalami kelambatan aplikasi yang ekstrim. Operasi tertentu, yang biasanya selesai dalam milidetik, membutuhkan lebih banyak waktu untuk diselesaikan. Ini karena CPU menggunakan seluruh kapasitasnya untuk Pengumpulan Sampah dan karenanya tidak dapat melakukan tugas lain apa pun.

3. Kesalahan dalam Tindakan

Mari kita lihat bagian kode yang menampilkan java.lang.OutOfMemoryError: GC Overhead Limit Exceeded.

Kita dapat mencapainya, misalnya, dengan menambahkan pasangan nilai kunci dalam loop yang tidak ditentukan:

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())); } } }

Saat metode ini dipanggil, dengan argumen JVM sebagai -Xmx100m -XX: + UseParallelGC ( ukuran heap Java disetel ke 100 MB dan Algoritma GC adalah ParallelGC), kita mendapatkan error java.lang.OutOfMemoryError: GC Overhead Limit Exceeded . Untuk mendapatkan pemahaman yang lebih baik tentang Algoritma Pengumpulan Sampah yang berbeda, kita dapat memeriksa tutorial Dasar-dasar Pengumpulan Sampah Java Oracle.

Kita akan mendapatkan error java.lang.OutOfMemoryError: GC Overhead Limit Exceeded dengan sangat cepat dengan menjalankan perintah berikut dari root proyek:

mvn exec:exec

Perlu juga dicatat bahwa dalam beberapa situasi kami mungkin mengalami kesalahan ruang heap sebelum menghadapi kesalahan GC Overhead Limit Exceeded .

4. Mengatasi Kesalahan yang Melebihi Batas Overhead GC

Solusi ideal adalah menemukan masalah yang mendasari aplikasi dengan memeriksa kode untuk kebocoran memori.

Pertanyaan berikut perlu dijawab:

  • Apa objek dalam aplikasi yang menempati sebagian besar heap?
  • Di bagian mana dari kode sumber objek ini dialokasikan?

Kami juga dapat menggunakan alat grafis otomatis seperti JConsole yang membantu mendeteksi masalah kinerja dalam kode termasuk java.lang.OutOfMemoryErrors.

Pilihan terakhir adalah meningkatkan ukuran heap dengan mengubah konfigurasi peluncuran JVM. Misalnya, ini memberikan ruang heap 1GB untuk aplikasi Java:

java -Xmx1024m com.xyz.TheClassName

Namun, ini tidak akan menyelesaikan masalah jika ada kebocoran memori dalam kode aplikasi yang sebenarnya. Sebagai gantinya, kami hanya akan menunda kesalahan tersebut. Oleh karena itu, lebih disarankan untuk menilai ulang penggunaan memori aplikasi secara menyeluruh.

5. Kesimpulan

Dalam tutorial ini, kami memeriksa java.lang.OutOfMemoryError: GC Overhead Limit Exceeded dan alasan di baliknya.

Seperti biasa, kode sumber yang terkait dengan artikel ini dapat ditemukan di GitHub.