- Sepengetahuan saya, ruang Heap ditempati oleh variabel instan saja. Jika ini benar, lalu mengapa kesalahan ini terjadi setelah berjalan dengan baik untuk beberapa waktu karena ruang untuk variabel contoh dialokasikan pada saat pembuatan objek.
Itu berarti Anda membuat lebih banyak objek dalam aplikasi Anda selama periode waktu tertentu secara terus menerus. Objek baru akan disimpan dalam memori heap dan itulah alasan pertumbuhan memori heap.
Heap tidak hanya berisi variabel instance. Ini akan menyimpan semua tipe data non-primitif (Objek). Umur objek ini mungkin pendek (blok metode) atau panjang (sampai objek direferensikan dalam aplikasi Anda)
- Apakah ada cara untuk menambah ruang heap?
Iya. Lihat artikel oracle ini untuk lebih jelasnya.
Ada dua parameter untuk menyetel ukuran heap:
-Xms : , yang menetapkan ukuran heap awal dan minimum
-Xmx:, yang menyetel ukuran heap maksimum
- Perubahan apa yang harus saya lakukan pada program saya sehingga Program ini akan mengambil lebih sedikit ruang heap?
Itu tergantung pada aplikasi Anda.
Setel memori heap maksimum sesuai kebutuhan aplikasi Anda
Jangan menyebabkan kebocoran memori di aplikasi Anda
Jika Anda menemukan kebocoran memori dalam aplikasi Anda, temukan akar masalah dengan bantuan alat pembuatan profil seperti MAT , Visual VM , jconsole , dll. Setelah Anda menemukan akar penyebabnya, perbaiki kebocoran tersebut.
Catatan penting dari artikel oracle
Penyebab: Pesan detail Java heap space menunjukkan bahwa objek tidak dapat dialokasikan di heap Java. Kesalahan ini tidak selalu berarti kebocoran memori.
Kemungkinan alasan:
- Konfigurasi yang tidak tepat (tidak mengalokasikan memori yang memadai)
- Aplikasi secara tidak sengaja menyimpan referensi ke objek dan ini mencegah objek dikumpulkan dari sampah
- Aplikasi yang menggunakan bahan finalisator secara berlebihan. Jika sebuah kelas memiliki metode penyelesaian, maka objek jenis itu tidak memiliki ruangnya yang diperoleh kembali pada waktu pengumpulan sampah. Jika thread finalizer tidak dapat mengikuti, dengan antrian finalisasi, maka heap Java dapat terisi dan jenis pengecualian OutOfMemoryError ini akan dilempar .
Pada catatan yang berbeda, gunakan algoritma pengumpulan Sampah yang lebih baik ( CMS atau G1GC )
Lihat pertanyaan ini untuk memahami G1GC