web-dev-qa-db-ja.com

Java GC(割り当て失敗)

なぜ常に "GC(Allocation Failure)"なのですか?

Linux-AMD64 JRE用のJava HotSpot(TM)64ビットサーバーVM(25.25-b02)(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]
98
user3644708

"Allocation Failure"は、GCサイクルが発生する原因です。

"Allocation Failure"とは、Edenにオブジェクトを割り当てるためのスペースが残っていないことを意味します。だから、それは若いGCの正常な原因です。

古いJVMは、マイナーGCサイクルのGC原因を出力していませんでした。

「割り当ての失敗」は、マイナーGCのほぼ唯一の原因です。マイナーGCが開始するもう1つの理由は、CMSリマークフェーズ(+XX:+ScavengeBeforeRemarkが有効な場合)です。

164
Alexey Ragozin

"Allocation Failure"が原因でGCがキックされるのは正しくありません。これはGC操作の結果です。

割り振るスペースがないときにGCが作動します(マイナーまたはメジャーGCが実行される領域に応じて)。スペースが十分に解放されていればGCが実行されると、サイズが十分でなければ失敗します。割り当て失敗はそのような失敗の1つです。以下の文書には良い説明があります https://docs.Oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html

5
Kamal Rathod