HOWTO · Java

Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded を解決する

このチュートリアルでは、java.lang.outofmemoryerror: gc オーバーヘッド制限を超えた Java のエラーについて説明します。

このページの内容

このチュートリアルでは、Java でのJava.lang.outofmemoryerror: GC オーバーヘッド制限を超えたエラーについて説明します。

Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded エラー

他のプログラミング言語とは異なり、Java ランタイムはガベージ コレクションにガベージ コレクタ GC プロセスを使用します。 Java では、メモリの特定の部分が使用されていないときはいつでも、ガベージ コレクタがメモリをクリアします。

エラー Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded は、コードまたはアプリケーションがすべてのメモリを使い果たし、GC がメモリをクリーンアップできない場合に発生します。

エラー Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded は、JVM がガベージ コレクションの実行に時間がかかりすぎたことを示しています。 ガベージ コレクションの実行に 98% の時間がかかり、残りの 2% のヒープしか回復できない場合、JVM はこのエラーをスローします。

同じエラーをスローする例を次に示します。

package delftstack;

import java.util.*;
public class Example {
  public static void main(String args[]) throws Exception {
    Map DemoMap = System.getProperties();
    Random DemoRandom = new Random();
    while (true) {
      DemoMap.put(DemoRandom.nextInt(), "value");
    }
  }
}

上記のコードは、ガベージ コレクションが 98% に達するまでランダム値をマップに継続的に配置し、Java.Lang.OutOfMemoryError: GC Overhead Limit Exceededをスローします。 ヒープ メモリはマップで使用されます。

出力を参照してください:

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"

並列ガベージ コレクターを使用してこのコードを実行しても、同じエラーがスローされます。 CMD を介して例を参照してください。

java -Xmx100m -XX:+UseParallelGC Example.java

それでも同じエラーがスローされます。 出力を参照してください:

C:\Users\Sheeraz>java -Xmx100m -XX:+UseParallelGC Example1.java
Note: Example1.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
        at java.base/java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1047)
        at java.base/java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006)
        at java.base/java.util.Properties.put(Properties.java:1301)
        at delftstack.Example.main(Example1.java:9)

Java.Lang.OutOfMemoryError: GC Overhead Limit Exceeded エラーを解決する

このエラーの解決策は、メモリ リークを防ぐことです。 メモリ リークを防ぐために、次の点に注意してください。

  1. ヒープのメモリ割り当てが行われる場所を特定します。
  2. 大量の弱参照オブジェクトまたは一時オブジェクトを作成しないことがベスト プラクティスです。これは、ほとんどの場合、これらがメモリ リークの原因となるためです。
  3. ヒープ上で大きなスペースを占めるオブジェクトを特定します。