Saya mendapatkan pesan kesalahan ini saat saya menjalankan tes JUnit saya:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Saya tahu apa itu OutOfMemoryError
itu, tetapi apa artinya batas atas GC? Bagaimana saya bisa memecahkan masalah ini?
java
garbage-collection
out-of-memory
heap-memory
Mnementh
sumber
sumber
OutOfMemoryError
skenario yang meningkatkan tumpukan bukan solusi yang valid: kehabisan utas asli dan kehabisan perm gen (yang terpisah dari tumpukan) adalah dua contoh. Hati-hati membuat pernyataan yang terlalu luas tentangOutOfMemoryErrors
; ada serangkaian hal yang tak terduga yang bisa menyebabkannya.Jawaban:
Pesan ini berarti bahwa karena suatu alasan pemulung mengambil banyak waktu (secara default 98% dari semua waktu CPU dari proses) dan memulihkan sedikit memori dalam setiap proses (secara default 2% dari tumpukan).
Ini secara efektif berarti bahwa program Anda berhenti melakukan kemajuan apa pun dan sibuk hanya menjalankan pengumpulan sampah setiap saat.
Untuk mencegah aplikasi Anda menghabiskan waktu CPU tanpa menyelesaikan apa pun, JVM melempar ini
Error
sehingga Anda memiliki kesempatan untuk mendiagnosis masalah.Kasus-kasus langka di mana saya melihat ini terjadi adalah ketika beberapa kode menciptakan banyak objek sementara dan banyak objek yang direferensikan dengan lemah di lingkungan yang sudah sangat dibatasi oleh memori.
Lihatlah panduan penyetelan Java GC, yang tersedia untuk berbagai versi Java dan berisi bagian tentang masalah khusus ini:
sumber
Mengutip dari artikel Oracle "Java SE 6 HotSpot [tm] Tuning Koleksi Mesin Virtual" :
EDIT: sepertinya seseorang dapat mengetik lebih cepat dari saya :)
sumber
-XX:
awal beberapa opsi baris perintah adalah flag of sort yang menunjukkan bahwa opsi ini sangat spesifik-VM dan tidak stabil (dapat berubah tanpa pemberitahuan di versi mendatang). Bagaimanapun,-XX:-UseGCOverheadLimit
flag memberitahu VM untuk menonaktifkan pengecekan batas overhead GC (sebenarnya "mematikannya"), sedangkan-Xmx
perintah Anda hanya meningkatkan heap. Dalam kasus terakhir pemeriksaan overhead GC masih berjalan , sepertinya tumpukan yang lebih besar memecahkan masalah meronta-ronta GC dalam kasus Anda (ini tidak akan selalu membantu).Jika Anda yakin tidak ada kebocoran memori dalam program Anda, cobalah untuk:
-Xmx1g
.-XX:+UseConcMarkSweepGC
.Jika perlu, pemeriksaan batas dapat dinonaktifkan dengan menambahkan opsi
-XX:-UseGCOverheadLimit
ke baris perintah.sumber
List
objek di dalam loop menyebabkan GC disebut 39 kali, bukan 22 kali.Biasanya kodenya. Berikut ini contoh sederhana:
Menggunakan Java 1.6.0_24-b07 pada Windows 7 32 bit.
Kemudian lihat
gc.log
Sekarang diberikan, ini bukan tes terbaik atau desain terbaik tetapi ketika dihadapkan pada situasi di mana Anda tidak punya pilihan selain menerapkan loop seperti itu atau ketika berhadapan dengan kode yang ada yang berperilaku buruk, memilih untuk menggunakan kembali objek daripada membuat yang baru dapat mengurangi berapa kali pengumpul sampah menghalangi ...
sumber
gc.log
file. Tes saya menunjukkan jauh lebih sedikit kali secara keseluruhan, tetapi waktu "Pemicu" paling sedikit untuk LEBIH BAIK, dan sekarang, BAD "lebih buruk" daripada TERBURUK sekarang. Hitungan saya: BURUK: 26, LEBIH BURUK: 22, LEBIH BAIK 21.List<Double> list
dalam loop luar daripada sebelum loop luar, dan Memicu 39 koleksi sampah.Penyebab kesalahan menurut Platform Java [8], Panduan Pemecahan Masalah Edisi Standar : (penekanan dan penambahan saluran ditambahkan)
Selain mengatur memori tumpukan dengan -
Xms1g -Xmx2g
, cobaLihat beberapa pertanyaan terkait terkait G1GC
Pengumpulan dan dokumentasi sampah Java 7 (JDK 7) di G1
Pengumpulan sampah Java G1 dalam produksi
Artikel teknologi Oracle untuk finetuning GC
sumber
Cukup tambahkan ukuran tumpukan sedikit dengan mengatur opsi ini di
Jalankan → Jalankan Konfigurasi → Argumen → Argumen VM
Xms - untuk batas minimum
Xmx - untuk batas maksimum
sumber
arguments
tab ... apa yang harus kita lakukan untuk mencapai ini?Bagi saya, langkah-langkah berikut ini berhasil:
eclipse.ini
filePerubahan
untuk
Mulai ulang Eclipse
Lihat disini
sumber
coba ini
buka
build.gradle
filesumber
Berikut ini bekerja untuk saya. Cukup tambahkan cuplikan berikut:
sumber
tingkatkan javaMaxHeapsize di file build.gradle (Module: app) Anda
ke (Tambahkan baris ini dalam gradle)
sumber
Deskripsi ukuran tumpukan Java (xms, xmx, xmn)
Mengatur ukuran awal heap Java. Ukuran standar adalah 2097152 (2MB). Nilai harus berupa kelipatan, dan lebih besar dari, 1024 byte (1KB). (Bendera -server meningkatkan ukuran default menjadi 32M.)
Mengatur ukuran heap Java awal untuk generasi Eden. Nilai standarnya adalah 640 ribu. (Bendera -server meningkatkan ukuran standar menjadi 2M.)
Mengatur ukuran maksimum tempat tumpukan Java dapat tumbuh. Ukuran standar adalah 64M. (Bendera -server meningkatkan ukuran standar menjadi 128M.) Batas tumpukan maksimum adalah sekitar 2 GB (2048MB).
Argumen memori Java (xms, xmx, xmn) diformat
Saat mengatur ukuran Java heap, Anda harus menentukan argumen memori Anda menggunakan salah satu huruf "m" atau "M" untuk MB, atau "g" atau "G" untuk GB. Pengaturan Anda tidak akan berfungsi jika Anda menentukan "MB" atau "GB." Argumen yang valid terlihat seperti ini:
-Xms64m atau -Xms64M -Xmx1g atau -Xmx1G Bisa juga menggunakan 2048MB untuk menentukan 2GB Juga, pastikan Anda hanya menggunakan bilangan bulat saat menentukan argumen Anda. Menggunakan -Xmx512m adalah opsi yang valid, tetapi -Xmx0.5g akan menyebabkan kesalahan.
Referensi ini dapat bermanfaat bagi seseorang.
sumber
Anda juga dapat meningkatkan alokasi memori dan ukuran tumpukan dengan menambahkan ini ke
gradle.properties
file Anda :org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g
Tidak harus 2048M dan 32g, buat sebesar yang Anda inginkan.
sumber
Soal:
Hanya menambahkan
org.gradle.jvmargs=-Xmx1024m
di
gradle.properties
dan jika tidak ada, buatlah.
sumber
Saya bekerja di Android Studio dan mengalami kesalahan ini ketika mencoba membuat APK yang ditandatangani untuk dirilis. Saya dapat membangun dan menguji APK debug tanpa masalah, tetapi segera setelah saya ingin membangun APK rilis, proses pembangunan akan berjalan selama beberapa menit dan akhirnya diakhiri dengan "Kesalahan java.lang.OutOfMemoryError: GC batas overhead terlampaui ". Saya meningkatkan ukuran heap untuk VM dan Android DEX compiler, tetapi masalahnya tetap ada. Akhirnya, setelah berjam-jam dan cangkir kopi ternyata masalahnya ada di file 'build.gradle' tingkat app saya - saya memiliki parameter 'minifyEnabled' untuk rilis build type yang disetel ke 'false', akibatnya menjalankan barang Proguard pada kode yang belum melalui proses penyusutan kode '(lihat https://developer.android.). Saya mengubah parameter 'minifyEnabled' menjadi 'true' dan rilis rilis dijalankan seperti mimpi :)
Singkatnya, saya harus mengubah file 'build.gradle' tingkat aplikasi saya dari: // ...
untuk
sumber
Untuk menambah ukuran tumpukan di IntelliJ IDEA, ikuti instruksi berikut. Ini berhasil untuk saya.
Untuk Pengguna Windows,
Pergi ke lokasi di mana IDE diinstal dan cari yang berikut.
Edit file dan tambahkan berikut ini.
Hanya itu saja !!
sumber
Anda dapat mencoba untuk membuat perubahan pada pengaturan server dengan merujuk pada gambar ini dan meningkatkan ukuran memori untuk memproses perubahan proses yang disorot dengan warna kuning
Anda juga dapat membuat perubahan ke tumpukan java dengan membuka cmd->
set _java_opts -Xmx2g
2g (2gigabytes) tergantung pada kompleksitas program Anda
mencoba menggunakan variabel temp dan variabel kurang konstan
sumber
Anda perlu menambah ukuran memori di Jdeveloper, pergi ke setDomainEnv.cmd .
dan
sumber
Di Netbeans, mungkin berguna untuk merancang ukuran tumpukan maksimum. Pergi ke Jalankan => Atur Konfigurasi Proyek => Kustomisasi . Di Jalankan dari jendela yang muncul, buka Opsi VM , isi
-Xms2048m -Xmx2048m
. Itu bisa memecahkan masalah ukuran tumpukan.sumber
Mem-boot ulang MacBook saya memperbaiki masalah ini untuk saya.
sumber
Saya tidak tahu apakah ini masih relevan atau tidak, tetapi hanya ingin berbagi apa yang berhasil untuk saya.
Perbarui versi kotlin ke yang terbaru tersedia. https://blog.jetbrains.com/kotlin/category/releases/
dan sudah selesai.
sumber