Java GC (Ayırma Hatası)


129

Neden her zaman "GC (Tahsis Başarısızlığı)"?

Linux-amd64 JRE ( 1.8.0_25 -b17) için Java HotSpot (TM) 64-Bit Sunucu VM (25.25- b02),

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]

Yanıtlar:


203

"Ayırma Hatası", GC döngüsünün devreye girmesinin bir nedenidir.

"Tahsis Başarısızlığı", Eden'de nesne tahsis etmek için daha fazla yer kalmadığı anlamına gelir. Bu nedenle, genç GC'nin normal nedenidir.

Daha eski JVM, küçük GC döngüleri için GC nedenini yazdırmıyordu.

"Tahsis Başarısızlığı" hemen hemen sadece küçük GC için olası nedendir. Küçük GC'nin tekme atmasının bir başka nedeni de CMS açıklama aşaması olabilir ( +XX:+ScavengeBeforeRemarketkinleştirilmişse).


1
Teşekkürler. Sadece eski JVM'nin Tahsis Başarısızlığını yazdırmadığını bulun.
user3644708

2
Bu cevabı tam olarak alamıyorum, bu yüzden kaçınılmalı mı yoksa edilmemeli mi? "genç GC'nin normal nedenidir". Genç GC yanlış seçim mi?
Thomas

7
Evet, bu normal bir davranış
Alexey Ragozin

184
GC (Tahsis Başarısızlığı), normalde günde birçok kez meydana gelecek bir olay için kötü bir kelime seçimidir. Bu JVM mühendisleri daha sık dışarı çıkmalı ve gerçek dünyada sosyalleşmeye çalışmalı, böylece insanların anlayacağı daha dostane terimleri öğrenebilirler.
Salvador Valencia

81
@SalvadorValencia Sorun değil, düzenli olarak GC günlüklerini okuyanlar da tam olarak "normal" değiller. :)
biziclop

8

"Tahsis Hatası", GC'nin tekme atmasının sebebidir doğru değil. GC işleminin bir sonucudur.

Tahsis edilecek alan olmadığında GC devreye girer (bölgeye bağlı olarak küçük veya büyük GC gerçekleştirilir). GC gerçekleştirildikten sonra, alan yeterince serbest bırakılırsa, ancak yeterli boyut yoksa başarısız olur. Tahsis Başarısızlığı böyle bir başarısızlıktır. Aşağıdaki belgenin iyi bir açıklaması var https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html


1
"(...) daha sonra bir ayırma hatası oluşur (çünkü canlı nesneleri tahliye edilen bölgeden ayıracak yer yoktur) ve dünyayı durdur (STW) tam toplama yapılır." - Java 1.8, sunucu modunda, kısa bir duraklama yaptım ve bu izlerin ikisi birlikte yazdırıldı: [GC (Atama Hatası) 2287742K-> 1148645K (2633216K), 0.4571912 saniye] [Tam GC (Ergonomi) 1148645K-> 1112141K (3184128K), 2.8563984 saniye]. Bu yüzden cevabınızı beğeniyorum ;-)
Jose Manuel Gomez Alvarez

-10

Jdk1.8'de CMS GC kullandığınızda bu hata göründüğünde, G1 Gc'yi değiştiriyorum bu sorunu çözüyorum.

 -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 

1
Bu neden bu kadar çok reddedildi? Bir açıklama faydalı olacaktır.
Mike Stoddart

2
Programınızı Rust'ta yeniden yazdığınızı ve artık böyle mesajlarınız olmadığını söylemek gibi bir şey mi?
justlizz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.