Saya mendapatkan pesan kesalahan berikut saat menjalankan program multi-threading
java.lang.OutOfMemoryError: Java heap space
Kesalahan di atas terjadi di salah satu utas.
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.
Apakah ada cara untuk menambah ruang heap?
Perubahan apa yang harus saya lakukan pada program saya sehingga Program ini akan mengambil lebih sedikit ruang heap?
java
multithreading
out-of-memory
heap-memory
Yatendra Goel
sumber
sumber
Jawaban:
Jika Anda ingin menambah ruang heap, Anda dapat menggunakan
java -Xms<initial heap size> -Xmx<maximum heap size>
di baris perintah. Secara default, nilai didasarkan pada versi JRE dan konfigurasi sistem. Anda dapat mengetahui lebih lanjut tentang opsi VM di situs web Java .Namun, saya akan merekomendasikan membuat profil aplikasi Anda untuk mencari tahu mengapa ukuran heap Anda dimakan. NetBeans memiliki profiler yang sangat bagus yang disertakan dengannya. Saya percaya itu menggunakan di
jvisualvm
bawah tenda. Dengan profiler, Anda dapat mencoba menemukan di mana banyak objek dibuat, kapan objek dikumpulkan sampah, dan banyak lagi.sumber
1.- Ya, tetapi ini cukup banyak mengacu pada seluruh memori yang digunakan oleh program Anda.
2.- Ya, lihat opsi Java VM
Yaitu
java -Xmx2g
tetapkan 2 gigabyte ram sebagai maksimum untuk aplikasi AndaTetapi Anda harus melihat apakah Anda tidak mengalami kebocoran memori terlebih dahulu.
3.- Itu tergantung pada programnya. Coba kebocoran memori spot. Pertanyaan ini akan sulit dijawab. Akhir-akhir ini Anda dapat membuat profil menggunakan JConsole untuk mencoba mencari tahu kemana tujuan ingatan Anda
sumber
Anda mungkin ingin melihat situs ini untuk mempelajari lebih lanjut tentang memori di JVM: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage
Saya merasa berguna menggunakan visualgc untuk melihat bagaimana bagian-bagian berbeda dari model memori terisi, untuk menentukan apa yang harus diubah.
Sulit untuk menentukan bagian mana dari memori yang terisi, oleh karena itu visualgc, karena Anda mungkin ingin mengubah bagian yang bermasalah, daripada hanya mengatakan,
Cobalah untuk lebih tepat tentang apa yang Anda lakukan, dalam jangka panjang Anda mungkin akan menemukan program yang lebih baik untuk itu.
Untuk menentukan di mana kebocoran memori mungkin Anda dapat menggunakan tes unit untuk itu, dengan menguji apa memori sebelum tes, dan setelahnya, dan jika ada perubahan yang terlalu besar maka Anda mungkin ingin memeriksanya, tetapi, Anda perlu lakukan pemeriksaan saat pengujian Anda masih berjalan.
sumber
Untuk meningkatkan ukuran heap, Anda bisa menggunakan argumen -Xmx saat memulai Java; misalnya
sumber
Anda bisa mendapatkan ukuran memori heap melalui program di bawah ini.
maka Anda juga dapat meningkatkan ukuran heap dengan menggunakan: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
sumber
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)
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
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
Kemungkinan alasan:
Pada catatan yang berbeda, gunakan algoritma pengumpulan Sampah yang lebih baik ( CMS atau G1GC )
Lihat pertanyaan ini untuk memahami G1GC
sumber
Dalam kebanyakan kasus, kode tidak dioptimalkan. Lepaskan benda-benda yang menurut Anda tidak akan dibutuhkan lebih lanjut. Hindari pembuatan objek di loop Anda setiap kali. Coba gunakan cache. Saya tidak tahu bagaimana kinerja aplikasi Anda. Tetapi dalam pemrograman, satu aturan kehidupan normal juga berlaku
Mencegah lebih baik daripada mengobati. "Jangan membuat objek yang tidak perlu"
sumber
Variabel lokal terletak di tumpukan. Ruang heap ditempati oleh objek.
Anda dapat menggunakan
-Xmx
opsi.Pada dasarnya ruang heap digunakan setiap kali Anda mengalokasikan objek baru dengan
new
dan dikosongkan beberapa saat setelah objek tidak lagi direferensikan. Jadi, pastikan Anda tidak menyimpan referensi ke objek yang tidak lagi Anda perlukan.sumber
Tidak, saya pikir Anda memikirkan ruang tumpukan. Ruang heap ditempati oleh objek. Cara untuk meningkatkannya adalah -Xmx256m, menggantikan 256 dengan jumlah yang Anda butuhkan pada baris perintah.
sumber
Untuk menghindari pengecualian itu, jika Anda menggunakan JUnit dan Spring, coba tambahkan ini di setiap kelas pengujian:
sumber
Di netbeans, Buka toolbar 'Run', -> 'Set Project Configuration' -> 'Customize' -> 'run' dari windo yang muncul -> 'VM Option' -> isi '-Xms2048m -Xmx2048m '. Itu bisa memecahkan masalah ukuran tumpukan.
sumber