Java GC(割り当て失敗)


129

なぜ「GC(割り当て失敗)」なのですか?

linux-amd64 JRE(1.8.0_25 -b17)用のJava HotSpot(TM)64ビットサーバー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]

回答:


202

「割り当てエラー」は、GCサイクルが発生する原因です。

「割り当て失敗」とは、オブジェクトを割り当てるためのスペースがEdenに残っていないことを意味します。したがって、それは若いGCの通常の原因です。

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

「割り当ての失敗」は、マイナーGCのほとんどの考えられる原因です。マイナーなGCがキックするもう1つの理由は、CMSリマークフェーズ(+XX:+ScavengeBeforeRemark有効な場合)である可能性があります。


1
ありがとう。古いJVMが割り当てエラーを出力しないことを確認してください。
user3644708

2
私はこの答えを完全には得ていないので、避けるべきですか?「それは若いGCの正常な原因です」。若いGCはそれでは間違った選択ですか?
トーマス

7
はい、これは正常な動作です
Alexey Ragozin

183
GC(割り当ての失敗)は、通常1日に何度も発生するイベントに適した言葉ではありません。これらのJVMエンジニアは、より頻繁に外に出て、現実世界で社交的になり、人々が理解できるより親しみやすい用語を学べるようにする必要があります。
サルバドールバレンシア

79
@SalvadorValencia大丈夫です、定期的にGCログを読む人も正確には「正常」ではありません。:)
ビジクロップ2017

8

「割り当てエラー」は、GCがキックする原因が正しくありません。これは、GC操作の結果です。

割り当てるスペースがない場合、GCが起動します(リージョンに応じて、マイナーまたはメジャーGCが実行されます)。スペースが十分に解放されている場合はGCが実行されますが、十分なサイズがない場合は失敗します。割り当ての失敗は、そのような失敗の1つです。以下のドキュメントには適切な説明があり ますhttps://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html


1
「(...)その後、割り当てエラーが発生し(退避される領域からライブオブジェクトを割り当てるためのスペースがないため)、Stop-the-World(STW)フルコレクションが実行されます。」-Java 1.8、サーバーモードで、短いポーズを再現しました。これらのトレースの両方が一緒に印刷されます:[GC(割り当てエラー)2287742K-> 1148645K(2633216K)、0.4571912秒] [フルGC(エルゴノミクス)1148645K-> 1112141K (3184128K)、2.8563984秒]。だから私はあなたの答えを賛成します;-)
ホセ・マヌエル・ゴメス・アルバレス

-10

jdk1.8でCMS GCを使用するとこのエラーが表示される場合は、G1 Gcを変更してこの問題を解決します。

 -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
なぜこれが何度も反対票を投じられたのですか?説明が役に立ちます。
マイクストッダート

2
Rustでプログラムを書き直したようなのに、そのようなメッセージがないのですか?
simplylizz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.