1概要

簡単に言うと、JVMはオブジェクトが使用されなくなったときにメモリを解放するようにします。このプロセスはガベージコレクションと呼ばれます(

GC

)。


GC Overhead Limit Exceeded

エラーは、

java.lang.OutOfMemoryError

ファミリーの1つであり、リソース(メモリ)の枯渇を示しています。

この簡単な記事では、

java.lang.OutOfMemoryError:GCオーバーヘッド制限を超えました

エラーの原因と解決方法について説明します。


2 GCオーバーヘッド制限を超えましたエラー


OutOfMemoryError

は、

java.lang.VirtualMachineError

のサブクラスです。 JVMはリソースの利用に関連した問題に遭遇したときにJVMによってスローされます。より具体的には、** このエラーは、JVMがガベージコレクションの実行に時間をかけすぎて、ごくわずかなヒープスペースしか再生できなかった場合に発生します。

Javaのドキュメントによると、デフォルトでは、JVMは、JavaプロセスがGCの実行時間の98%以上を費やし、各実行で2%未満のヒープしか回復されない場合に、このエラーをスローするように設定されています。言い換えれば、これは私たちのアプリケーションが利用可能なメモリをほぼすべて使い果たし、ガベージコレクタがそれをきれいにしようとすることに多くの時間を費やし、繰り返し失敗したことを意味します。

このような状況では、ユーザーはアプリケーションの動作が極端に遅くなります。

通常ミリ秒単位で完了する特定の操作は、完了するのにより長い時間がかかります。これは、CPUがガベージコレクションに全容量を使用しているため、他のタスクを実行できないためです。


3アクションエラー

__java.lang.OutOfMemoryErrorをスローするコードを見てみましょう。

GCオーバーヘッド制限を超えました。

これは、たとえば、終了しないループにキーと値のペアを追加することによって実現できます。

public class OutOfMemoryGCLimitExceed {
    public static void addRandomDataToMap() {
        Map<Integer, String> dataMap = new HashMap<>();
        Random r = new Random();
        while (true) {
            dataMap.put(r.nextInt(), String.valueOf(r.nextInt()));
        }
    }
}

JVM引数を

__-Xmx100m -XX:UseParallelGC(


Javaヒープサイズを100MBに設定し、GCアルゴリズムをParallelGCに設定)としてこのメ​​ソッドを呼び出すと、

java.lang.OutOfMemoryError:GC Overhead Limit Exceeded__エラーが発生します。さまざまなガベージコレクションアルゴリズムの理解を深めるために、Oracleのhttp://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc0​​1/index.html[Java Garbage Collection Basics]チュートリアルをチェックしてください。


project

のルートから次のコマンドを実行すると、

java.lang.OutOfMemoryError:GC Overhead Limit Exceeded

エラーがすぐに表示されます。

mvn exec:exec

状況によっては、

GC Overhead Limit Exceeded

エラーが発生する前にヒープスペースエラーが発生する可能性があることにも注意してください。


4 GCオーバーヘッド制限の解決エラーを超えました

理想的な解決策は、メモリリークがないかコードを調べてアプリケーションの根本的な問題を見つけることです。

以下の質問に対処する必要があります。

  • アプリケーションの大部分を占めるオブジェクトは何ですか。

ヒープ?

  • これらのオブジェクトは、ソースコードのどの部分に割り当てられていますか?


JConsole

などの自動化されたグラフィカルツールを使用することもできます。 .OutOfMemoryErrors.__

最後の手段は、JVM起動構成を変更してヒープサイズを増やすことです。たとえば、これはJavaアプリケーション用に1GBのヒープスペースを与えます。

java -Xmx1024m com.xyz.TheClassName

ただし、実際のアプリケーションコードにメモリリークがある場合、これは問題を解決しません。代わりに、エラーを延期します。

そのため、アプリケーションのメモリ使用量を徹底的に再評価することをお勧めします。


5結論

このチュートリアルでは、

java.lang.OutOfMemoryError:GCオーバーヘッド制限を超えました

とその理由について調べました。

いつものように、この記事に関連するソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java[over on GitHub]にあります。