テストを実行すると、次のエラー メッセージが表示されますJUnit
。
java.lang.OutOfMemoryError: GC overhead limit exceeded
が何であるかは分かっていますOutOfMemoryError
が、GC オーバーヘッド制限とは何を意味しますか? これを解決するにはどうすればよいでしょうか?
ベストアンサー1
このメッセージは、何らかの理由でガベージ コレクターが過剰な時間 (デフォルトではプロセスの全 CPU 時間の 98%) を費やしており、実行ごとにほとんどメモリが回復されていない (デフォルトではヒープの 2%) ことを意味します。
これは事実上、プログラムが進行を停止し、常にガベージ コレクションのみを実行していることを意味します。
アプリケーションが何もせずに CPU 時間を消費するのを防ぐために、JVM はこれをスローしてError
問題を診断する機会を提供します。
私が見た中で、このようなことが起こる稀なケースは、すでにメモリが非常に制限されている環境で、何らかのコードが大量の一時オブジェクトと大量の弱参照オブジェクトを作成していた場合です。
さまざまな Java バージョンで利用可能で、この特定の問題に関するセクションが含まれている Java GC チューニング ガイドを確認してください。
- Java 11 チューニング ガイドさまざまなガベージ コレクターの過剰な GC に関する専用のセクションがあります。
- のためにパラレルコレクター
- のために同時マークスイープ (CMS) コレクター
- ガベージファースト (G1) コレクターのこの特定のエラー状態については言及されていません。
- Java 8 チューニング ガイドそしてその過剰なGCセクション
- Java 6 チューニング ガイドそしてその過剰なGCセクション。