Java GC (Kegagalan Alokasi)

129

Mengapa selalu "GC (Kegagalan Alokasi)"?

Java HotSpot (TM) 64-Bit Server VM (25.25-b02) untuk linux-amd64 JRE ( 1.8.0_25 -b17),

CommandLine flags: 
-XX:CMSInitiatingOccupancyFraction=60 
-XX:GCLogFileSize=10485760 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:InitialHeapSize=32212254720 
-XX:MaxHeapSize=32212254720 
-XX:NewRatio=10 
-XX:OldPLABSize=16 
-XX:ParallelGCThreads=4 
-XX:+PrintGC 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-XX:+PrintStringTableStatistics 
-XX:+PrintTenuringDistribution 
-XX:StringTableSize=1000003 
-XX:SurvivorRatio=4 
-XX:TargetSurvivorRatio=50 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC
27.329: [GC (Allocation Failure) 27.329: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15)
- age   1:   16885304 bytes,   16885304 total
: 349568K->16618K(436928K), 0.2069129 secs] 349568K->16618K(31369920K), 0.2070712 secs] [Times: user=0.78 sys=0.04, real=0.21 secs]


28.210: [GC (Allocation Failure) 28.210: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15)
- age   1:   28866504 bytes,   28866504 total
- age   2:   12582536 bytes,   41449040 total
: 366186K->47987K(436928K), 0.2144807 secs] 366186K->47987K(31369920K), 0.2146024 secs] [Times: user=0.84 sys=0.01, real=0.22 secs]


29.037: [GC (Allocation Failure) 29.038: [ParNew
Desired survivor size 44728320 bytes, new threshold 2 (max 15)
- age   1:   28443488 bytes,   28443488 total
- age   2:   28386624 bytes,   56830112 total
- age   3:   12579928 bytes,   69410040 total
: 397555K->76018K(436928K), 0.2357352 secs] 397555K->76018K(31369920K), 0.2358535 secs] [Times: user=0.93 sys=0.01, real=0.23 secs]
pengguna3644708
sumber

Jawaban:

203

"Kegagalan Alokasi" adalah penyebab siklus GC dimulai.

"Kegagalan Alokasi" berarti tidak ada lagi ruang yang tersisa di Eden untuk mengalokasikan objek. Jadi, itu adalah penyebab normal dari GC muda.

JVM yang lebih lama tidak mencetak penyebab GC untuk siklus GC kecil.

"Kegagalan Alokasi" hampir hanya mungkin menjadi penyebab GC minor. Alasan lain untuk menendang GC kecil adalah fase komentar CMS (jika +XX:+ScavengeBeforeRemarkdiaktifkan).

Alexey Ragozin
sumber
1
Terima kasih. Temukan bahwa JVM lama tidak mencetak Kegagalan Alokasi.
user3644708
2
Saya tidak mendapatkan jawaban ini sepenuhnya, jadi harus dihindari atau tidak? "Itu adalah penyebab normal GC muda". Apakah GC muda itu pilihan yang salah?
Thomas
7
Ya, ini adalah perilaku normal
Alexey Ragozin
183
GC (Kegagalan Alokasi) adalah pilihan kata yang buruk untuk acara yang biasanya terjadi beberapa kali sehari. Insinyur JVM tersebut harus lebih sering keluar dan mencoba bersosialisasi di dunia nyata sehingga mereka dapat mempelajari istilah-istilah yang lebih ramah yang dipahami orang.
Salvador Valencia
80
@SalvadorValencia Tidak apa-apa, orang yang membaca log GC secara teratur juga tidak "normal". :)
biziclop
8

"Kegagalan Alokasi" adalah penyebab tendangan GC tidak benar. Ini adalah hasil dari operasi GC.

GC dimulai ketika tidak ada ruang untuk mengalokasikan (tergantung pada wilayah kecil atau GC utama dilakukan). Setelah GC dilakukan jika ruang dibebaskan cukup baik, tetapi jika tidak cukup ukuran gagal. Kegagalan Alokasi adalah salah satu kegagalan tersebut. Dokumen di bawah ini memiliki penjelasan yang baik https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html

Kamal Rathod
sumber
1
"(...) maka kegagalan alokasi terjadi (karena tidak ada ruang untuk mengalokasikan objek hidup dari wilayah yang dievakuasi) dan pengumpulan penuh stop-the-world (STW) dilakukan." - Dalam java 1.8, mode server, saya telah mereproduksi jeda singkat dan kedua jejak ini dicetak bersama: [GC (Kegagalan Alokasi) 2287742K-> 1148645K (2633216K), 0,4571912 dtk] [GC Penuh (Ergonomi) 1148645K-> 1112141K (3184128K), 2.8563984 detik]. Jadi saya mendukung jawaban Anda ;-)
Jose Manuel Gomez Alvarez
-10

Ketika menggunakan CMS GC di jdk1.8 akan melihat kesalahan ini, saya mengubah G1 Gc memecahkan masalah ini.

 -Xss512k -Xms6g -Xmx6g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=70 -XX:NewRatio=1 -XX:SurvivorRatio=6 -XX:G1ReservePercent=10 -XX:G1HeapRegionSize=32m -XX:ConcGCThreads=6 -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 
Hatter Bush
sumber
1
Mengapa ini ditolak berkali-kali? Penjelasan akan bermanfaat.
Mike Stoddart
2
Karena itu seperti mengatakan bahwa Anda menulis ulang program Anda di Rust dan sekarang Anda tidak memiliki pesan seperti itu?
simplylizz