Saya menulis sisi klien Ayunan aplikasi (grafis desainer font) pada Jawa 5. Baru-baru ini, saya berjalan ke jawa.lang.OutOfMemoryError: Java heap space
kesalahan karena saya tidak sedang konservatif pada penggunaan memori. Pengguna dapat membuka jumlah yang tidak terbatas file, dan program terus dibuka benda-benda di dalam memori. Setelah penelitian, saya menemukan Ergonomi di 5.0 Java Virtual Machine dan lain-lain mengatakan pada Windows machine JVM default max heap size sebagai 64MB
.
Mengingat situasi ini, bagaimana saya harus menangani kendala ini?
Saya bisa meningkatkan max heap size menggunakan command line pilihan untuk java, tapi itu akan memerlukan mengetahui RAM yang tersedia dan menulis beberapa peluncuran program atau script. Selain itu, peningkatan untuk beberapa terbatas max tidak akhirnya menyingkirkan masalah ini.
Aku bisa menulis ulang beberapa kode saya untuk bertahan objek untuk sistem file yang sering (menggunakan database adalah hal yang sama) untuk membebaskan memori. Itu bisa bekerja, tapi itu's mungkin banyak bekerja terlalu.
Jika anda bisa mengarahkan saya untuk rincian di atas ide-ide atau beberapa alternatif seperti otomatis memori virtual, memperpanjang ukuran tumpukan dinamis, yang akan menjadi besar.
Pada akhirnya anda selalu memiliki terbatas max heap digunakan tidak peduli platform apa yang anda berjalan di. Di Windows 32 bit ini adalah sekitar 2GB
(tidak secara khusus tumpukan tapi total jumlah memori per proses). Itu hanya terjadi bahwa Jawa memilih untuk membuat standar yang lebih kecil (mungkin sehingga programmer dapat't membuat program-program yang telah pelarian alokasi memori tanpa menjalankan ke dalam masalah ini dan harus memeriksa apa yang mereka lakukan).
Jadi, ini mengingat ada beberapa pendekatan yang dapat anda ambil untuk menentukan jumlah memori yang anda butuhkan atau untuk mengurangi jumlah memori yang anda gunakan. Salah satu kesalahan umum dengan sampah yang dikumpulkan bahasa seperti Java atau C# adalah untuk menjaga sekitar referensi ke objek yang anda lagi menggunakan atau mengalokasikan banyak benda-benda ketika anda bisa reuse mereka sebagai gantinya. Selama benda-benda yang memiliki referensi ke mereka, mereka akan terus menggunakan heap space sebagai pengumpul sampah tidak akan menghapusnya.
Dalam hal ini anda dapat menggunakan Java memori profiler untuk menentukan metode apa dalam program anda mengalokasikan sejumlah besar benda-benda dan kemudian menentukan apakah ada cara untuk membuat yakin mereka tidak lagi dirujuk, atau untuk tidak mengalokasikan mereka di tempat pertama. Salah satu pilihan yang saya telah digunakan di masa lalu adalah "JMP" http://www.khelekore.org/jmp/.
Jika anda menentukan bahwa anda mengalokasikan benda-benda ini untuk sebuah alasan, dan anda perlu untuk tetap di sekitar referensi (tergantung pada apa yang anda lakukan ini mungkin terjadi), anda hanya akan perlu untuk meningkatkan max heap size ketika anda memulai program. Namun, setelah anda melakukan memori profil dan memahami bagaimana benda anda mendapatkan dialokasikan anda harus memiliki gagasan yang lebih baik tentang berapa banyak memori yang anda butuhkan.
Pada umumnya jika anda bisa't menjamin bahwa program anda akan berjalan dalam beberapa jumlah terbatas memori (mungkin tergantung pada ukuran input) anda akan selalu berlari ke dalam masalah ini. Hanya setelah melelahkan semua ini akan anda butuhkan untuk melihat ke dalam cache benda-benda ke disk dll. Pada titik ini anda harus memiliki alasan yang sangat baik untuk mengatakan "saya perlu Xgb memori" untuk sesuatu dan anda dapat't bekerja di sekitar itu dengan meningkatkan algoritma atau alokasi memori pola. Umumnya hal ini hanya akan biasanya menjadi kasus untuk algoritma yang beroperasi pada dataset besar (seperti database atau beberapa analisis ilmiah program) dan kemudian teknik seperti cache dan memory mapped IO menjadi berguna.
Menjalankan Java dengan opsi baris perintah -Xmx
, yang menetapkan maksimum ukuran heap.
Anda bisa menentukan per proyek berapa banyak ruang tumpukan proyek anda inginkan
Berikut adalah untuk Eclipse Helios/Juno/Kepler:
Klik kanan mouse pada
Run As - Run Configuration - Arguments - Vm Arguments,
kemudian tambahkan ini
-Xmx2048m
Meningkatkan ukuran tumpukan bukan "memperbaiki" adalah "plester", 100% sementara. Itu akan crash lagi di tempat lain. Untuk menghindari masalah ini, menulis kinerja tinggi kode.
Big peringatan ---- di kantor saya, kami menemukan bahwa (pada beberapa mesin windows) kita tidak bisa mengalokasikan lebih dari 512m untuk Java heap. Ini ternyata karena Kaspersky produk anti-virus diinstal pada beberapa mesin. Setelah menguninstall itu AV produk, kita menemukan kita bisa mengalokasikan setidaknya 1,6 gb, saya.e, -Xmx1600m
(m adalah wajib bijaksana lainnya akan menyebabkan kesalahan lain "Terlalu awal kecil heap") bekerja.
Tidak tahu jika hal ini terjadi dengan AV lainnya produk tapi diduga hal ini terjadi karena program AV adalah memesan sebuah blok kecil memori di setiap ruang alamat, sehingga mencegah tunggal yang benar-benar besar alokasi.
VM argumen bekerja untuk saya di eclipse. Jika anda menggunakan eclipse versi 3.4, lakukan hal berikut
pergi ke Run --> Jalankan Konfigurasi -->
kemudian pilih proyek di bawah maven membangun --> kemudian pilih tab "JRE" --> kemudian masukkan -Xmx1024m
.
Atau anda bisa melakukan Run --> Jalankan Konfigurasi --> pilih "JRE" tab -->
kemudian enter -Xmx1024m
Ini harus meningkatkan memori heap untuk membangun/proyek. Di atas ukuran memori 1 GB. Anda dapat mengoptimalkan cara yang anda inginkan.
Ya, dengan -Xmx
anda dapat mengkonfigurasi lebih banyak memori untuk JVM.
Untuk memastikan bahwa anda don't kebocoran atau membuang-buang memori. Mengambil tumpukan sampah dan gunakan Gerhana Memory Analyzer untuk menganalisis memori anda konsumsi.
Saya ingin menambahkan rekomendasi dari oracle pemecahan masalah artikel.
Terkecuali di thread thread_name: java.lang.OutOfMemoryError: Java heap space
detail pesan Java heap space menunjukkan objek tidak dapat dialokasikan di Jawa tumpukan. Kesalahan ini tidak selalu berarti kebocoran memori
Kemungkinan penyebab:
Konfigurasi sederhana masalah, di mana ditentukan ukuran tumpukan adalah cukup untuk aplikasi.
Aplikasi ini tidak sengaja memegang referensi ke objek, dan ini mencegah benda-benda dari sampah yang dikumpulkan.
Penggunaan berlebihan finalizers.
Satu sumber potensial kesalahan ini muncul dengan aplikasi yang membuat penggunaan yang berlebihan dari finalizers. Jika sebuah class memiliki finalize, maka objek dari jenis yang tidak memiliki ruang mereka kembali di waktu pengumpulan sampah
Setelah pengumpulan sampah, benda-benda yang antri untuk finalisasi, yang terjadi di kemudian waktu. finalizers dijalankan oleh daemon benang yang jasa finalisasi antrian. Jika finalizer benang tidak dapat bersaing dengan finalisasi antrian, maka Java heap bisa mengisi dan jenis OutOfMemoryError exception akan dilempar.
Salah satu skenario yang dapat menyebabkan situasi ini adalah ketika sebuah aplikasi yang menciptakan prioritas tinggi benang penyebab finalisasi antrian untuk meningkatkan pada tingkat yang lebih cepat dari tingkat di mana finalizer benang melayani antrian.
Ikuti langkah di bawah ini:
Terbuka catalina.sh
dari tomcat/bin.
Perubahan JAVA_OPTS untuk
JAVA_OPTS="-Djava.awt.tanpa kepala=true -Dfile.encoding=UTF-8 -server -Xms1536m -Xmx1536m -XX:Baruukuran=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
Saya telah menghadapi masalah yang sama dari java heap size.
Aku punya dua solusi jika anda menggunakan java 5(1.5).
hanya menginstal jdk1.6 dan pergi ke preferensi eclipse dan mengatur jre jalan jav1 1.6 seperti yang telah anda instal.
Cek VM argumen dan biarlah apa pun itu. hanya menambahkan satu baris di bawah ini dari semua argumen yang ada di VM argumen sebagai -Xms512m -Xmx512m -XX:MaxPermSize=...m(192m).
Saya pikir itu akan bekerja...
Jika anda perlu untuk memantau penggunaan memori pada saat runtime, yang jawa.lang.manajemen
paket menawarkan MBeans
yang dapat digunakan untuk memantau memori renang di VM anda (misalnya, eden ruang, bertenor generasi dll), dan juga pengumpulan sampah mendatang.
Gratis heap space dilaporkan oleh MBeans akan sangat bervariasi tergantung pada GC perilaku, terutama jika aplikasi anda menghasilkan banyak benda-benda yang kemudian GC-ed. Satu pendekatan adalah untuk memantau gratis heap space setelah masing-masing penuh GC, yang anda dapat menggunakan untuk membuat keputusan membebaskan memori dengan bertahan benda-benda.
Pada akhirnya, anda bertaruh terbaik adalah untuk membatasi retensi memori anda sejauh mungkin sementara kinerja yang masih dapat diterima. Seperti komentar sebelumnya mencatat, memori selalu terbatas, tapi aplikasi anda harus memiliki strategi untuk berurusan dengan memori kelelahan.
Saya membaca di suatu tempat lain yang bisa anda coba - menangkap jawa.lang.OutOfMemoryError dan menangkap blok, anda dapat akses semua sumber daya yang anda tahu mungkin menggunakan banyak memori, tutup koneksi dan sebagainya, kemudian lakukan Sistem.gc()
kemudian kembali mencoba apa pun yang anda akan lakukan.
Cara lain adalah ini meskipun, saya don't tahu apakah ini akan berhasil, tapi saat ini saya menguji apakah itu akan bekerja pada aplikasi saya.
Idenya adalah untuk melakukan pengumpulan Sampah dengan Sistem panggilan.gc() yang dikenal untuk meningkatkan memori. Anda dapat tetap memeriksa ini setelah memori menelan kode dijalankan.
//Mimimum acceptable free memory you think your app needs
long minRunningMemory = (1024*1024);
Runtime runtime = Runtime.getRuntime();
if(runtime.freeMemory()<minRunningMemory)
System.gc();
Cara mudah untuk memecahkan OutOfMemoryError
di jawa adalah untuk meningkatkan maksimum ukuran tumpukan dengan menggunakan JVM opsi -Xmx512M
, ini akan segera memecahkan OutOfMemoryError. Ini adalah solusi yang lebih disukai ketika saya mendapatkan OutOfMemoryError di Eclipse Maven atau SEMUT sementara proyek bangunan karena berdasarkan ukuran proyek anda dapat dengan mudah kehabisan Memori.
Berikut adalah contoh dari meningkatnya maksimum tumpukan ukuran JVM, Juga baik untuk menjaga -Xmx ke -Xms jatah 1:1 atau 1:1.5 jika anda mengatur ukuran tumpukan di aplikasi java.
ekspor JVM_ARGS="-Xms1024m -Xmx1024m"
Secara default untuk pengembangan JVM menggunakan ukuran kecil dan kecil config untuk kinerja lainnya terkait fitur. Tapi untuk produksi anda dapat menyetel misalnya (selain itu Aplikasi Server tertentu config bisa eksis) -> (Jika masih ada isn't memori yang cukup untuk memenuhi permintaan dan tumpukan sudah mencapai ukuran maksimum, yang OutOfMemoryError akan terjadi)
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
-XX:ParallelGCThreads=8
-XX:+CMSClassUnloadingEnabled
-XX:InitiatingHeapOccupancyPercent=70
-XX:+UnlockDiagnosticVMOptions
-XX:+UseConcMarkSweepGC
-Xms512m
-Xmx8192m
-XX:MaxPermSize=256m (in java 8 optional)
Misalnya: Pada Platform linux untuk produksi mode lebih baik pengaturan.
Setelah men-download dan mengkonfigurasi server dengan cara ini http://www.ehowstuff.com/how-to-install-and-setup-apache-tomcat-8-on-centos-7-1-rhel-7/
1.membuat setenv.sh file pada folder /opt/tomcat/bin/
touch /opt/tomcat/bin/setenv.sh
2.Membuka dan menulis ini params untuk pengaturan lebih baik mode.
nano /opt/tomcat/bin/setenv.sh
export CATALINA_OPTS="$CATALINA_OPTS -XX:ParallelGCThreads=8"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+CMSClassUnloadingEnabled"
export CATALINA_OPTS="$CATALINA_OPTS -XX:InitiatingHeapOccupancyPercent=70"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UnlockDiagnosticVMOptions"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseConcMarkSweepGC"
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxMetaspaceSize=256M"
3.layanan restart tomcat
Perhatikan bahwa JVM menggunakan memori lebih dari sekedar tumpukan. Misalnya metode Java, tumpukan benang dan asli pegangan yang dialokasikan di memori terpisah dari tumpukan, serta JVM struktur data internal.
Perhatikan bahwa jika anda perlu ini dalam penyebaran situasi, pertimbangkan untuk menggunakan Java WebStart (dengan "ondisk" versi, bukan jaringan yang mungkin di Jawa 6u10 dan kemudian) karena memungkinkan anda untuk menentukan berbagai argumen untuk JVM dengan cara lintas platform.
Jika tidak, anda akan memerlukan sebuah sistem operasi tertentu launcher yang menetapkan argumen yang anda butuhkan.
Jika masalah ini terjadi di Wildfly 8 dan JDK1.8,maka kita perlu menentukan MaxMetaSpace pengaturan bukannya PermGen pengaturan.
Misalnya kita perlu tambahkan konfigurasi di bawah ini setenv.sh file dari wildfly.
JAVA_OPTS="$JAVA_OPTS -XX:MaxMetaspaceSize=256M"
Untuk informasi lebih lanjut, silakan cek Wildfly Tumpukan Masalah
Jika anda terus mengalokasikan & menyimpan referensi ke objek, anda akan mengisi setiap jumlah memori yang anda miliki.
Salah satu pilihan adalah untuk melakukan file transparan dekat & terbuka ketika mereka beralih tab (anda hanya menyimpan pointer ke file, dan ketika pengguna beralih tab, anda menutup & bersih semua benda... itu'll membuat perubahan file lebih lambat... tapi...), dan mungkin tetap hanya 3 atau 4 file pada memori.
Hal lain yang harus anda lakukan adalah, ketika pengguna membuka file, beban, dan mencegat setiap OutOfMemoryError, maka (karena itu adalah tidak mungkin untuk membuka file) menutup file, membersihkan benda-benda dan memperingatkan pengguna bahwa ia harus menutup file yang tidak terpakai.
Ide anda secara dinamis memperluas memori virtual doesn't memecahkan masalah, untuk mesin terbatas pada sumber daya, jadi anda harus hati-hati & menangani masalah memori (atau setidaknya, hati-hati dengan mereka).
Beberapa petunjuk i've terlihat dengan kebocoran memori adalah:
--> Terus diingat bahwa jika anda memasukkan sesuatu ke dalam koleksi dan setelah itu lupa tentang hal itu, anda masih memiliki referensi yang kuat untuk itu, agar membatalkan koleksi, bersih itu atau melakukan sesuatu dengan itu... jika tidak anda akan menemukan kebocoran memori sulit untuk menemukan.
--> Mungkin, menggunakan koleksi dengan lemah referensi (weakhashmap...) dapat membantu dengan masalah memori, tetapi anda *harus *** hati-hati dengan hal ini, anda mungkin menemukan bahwa objek anda terlihat untuk telah dikumpulkan.
--> ide Lain saya've ditemukan adalah untuk mengembangkan terus-menerus koleksi yang tersimpan di database benda-benda yang jarang digunakan dan transparan dimuat. Ini mungkin akan menjadi pendekatan yang terbaik...