web-dev-qa-db-ja.com

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

JUnitテストを実行すると、このエラーメッセージが表示されます。

Java.lang.OutOfMemoryError: GC overhead limit exceeded

OutOfMemoryErrorはどういう意味ですか?GCオーバーヘッド制限とはどういう意味ですか?どうすればこれを解決できますか?

703
Mnementh

このメッセージは、何らかの理由でガベージコレクタが過度の時間(デフォルトではプロセスの全CPU時間の98%)を消費し、各実行でごくわずかなメモリしか回復しないことを意味します(デフォルトでは2%のヒープ)。

これは事実上あなたのプログラムがいかなる進行もしなくなり、常にガベージコレクションのみを実行するのに忙しいことを意味します。

アプリケーションが何もしなくてもCPU時間を浪費しないようにするために、JVMはこのErrorをスローして、問題を診断できるようにします。

私がこれを見たことがあるまれなケースは、いくつかのコードがすでに非常にメモリに制約された環境で大量の一時的なオブジェクトと大量の弱く参照されたオブジェクトを作成していたところです。

詳細については この記事 を参照してください(具体的には この部分 )。

687
Joachim Sauer

GCは、リターンが少なすぎるためにガベージコレクションに時間がかかりすぎると、この例外をスローします。 CPU時間の98%がGCに費やされ、2%未満のヒープしか回復されません。

この機能は、ヒープが小さすぎるために、ほとんどまたはまったく進まずに、アプリケーションが長時間実行されないようにするためのものです。

コマンドラインオプション-XX:-UseGCOverheadLimitでこれをオフにすることができます

より多くの情報 ここ

編集:誰かが私よりも速く入力できるように見えます:)

189
dave

プログラムに メモリリークがないことを確認したら を試してください。

  1. -Xmx1gのようにヒープサイズを増やします。
  2. 同時ローポーズコレクター-XX:+UseConcMarkSweepGCを有効にします。
  3. メモリを節約するために、可能であれば既存のオブジェクトを再利用してください。

必要ならば、 limit check をオプション-XX:-UseGCOverheadLimitをコマンドラインに追加することで無効にすることができます。

78

通常はコードです。これは簡単な例です:

import Java.util.*;

public class GarbageCollector {

    public static void main(String... args) {

        System.out.printf("Testing...%n");
        List<Double> list = new ArrayList<Double>();
        for (int outer = 0; outer < 10000; outer++) {

            // list = new ArrayList<Double>(10000); // BAD
            // list = new ArrayList<Double>(); // WORSE
            list.clear(); // BETTER

            for (int inner = 0; inner < 10000; inner++) {
                list.add(Math.random());
            }

            if (outer % 1000 == 0) {
                System.out.printf("Outer loop at %d%n", outer);
            }

        }
        System.out.printf("Done.%n");
    }
}

Java 1.6.0_24-b07の使用Windows 7 32ビット上で。

Java -Xloggc:gc.log GarbageCollector

それからgc.logを見てください

  • BAD方式で444回トリガ
  • WORSE法を使用して666回トリガーした
  • BETTERメソッドを使用して354回トリガした

今は当然のことですが、これは最善のテストや最善の設計ではありませんが、このようなループを実装する以外に選択の余地がない状況や動作が悪い既存のコードを扱う場合ガベージコレクタが邪魔をする回数...

38
Mike

エラーの原因

「GCオーバーヘッド制限を超えました」は、ガベージコレクタが常に実行されており、Javaプログラムの進行が非常に遅いことを示しています。

ガベージコレクションの後、Javaプロセスがガベージコレクションの実行時間の約98%以上を費やしている _で、それまでの回復がヒープの2%未満で、これまでに行った場合時定数をコンパイルする)連続したガベージコレクション、そして Java.lang.OutOfMemoryError がスローされる

  1. 現在のヒープが十分でない場合、ヒープサイズを増やす
  2. それでもこのエラーが発生する場合は、 MAT (メモリアナライザツール)、 Visual VM などのようにmemory プロファイリングツールを使用し、メモリリークを修正してください。
  3. JDKバージョンを最新バージョン(1.8.x)または少なくとも1.7.xにアップグレードし、G1GCアルゴリズムを使用してください。 。 G1 GCのスループット目標は、90%のアプリケーション時間と10%のガベージコレクション時間です
  4. ヒープメモリを-Xms1g -Xmx2gで設定することとは別に、試してみてください

    -XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m  
    -XX:ParallelGCThreads=n -XX:ConcGCThreads=n
    

G1GCに関するその他の関連質問をご覧ください。

Java 7(JDK 7)のガベージコレクションとG1のドキュメント

本番環境でのJava G1ガベージコレクション

GCの微調整のためのOracleの技術記事

28
Ravindra babu

このオプションをに設定して、ヒープサイズを少し大きくしてください。

実行→実行設定→引数→VM引数

-Xms1024M -Xmx2048M

Xms - 最小値の場合

Xmx - 上限値の場合

26
chopss

私にとっては、次のステップがうまくいきました。

  1. Eclipse.iniファイルを開く
  2. 変化する

    -Xms40m
    -Xmx512m
    

    -Xms512m
    -Xmx1024m
    
  3. Eclipseを再起動します

ここをクリック

13

次は私のために働いた。次のスニペットを追加するだけです。

Android {
        compileSdkVersion 25
        buildToolsVersion '25.0.1'

defaultConfig {
        applicationId "yourpackage"
        minSdkVersion 10
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
dexOptions {
        javaMaxHeapSize "4g"
    }
}
10
H.S.H

これを試して

build.gradleファイルを開く

  Android {
        dexOptions {
           javaMaxHeapSize = "4g"
        }
   }
10
alicanozkara

build.gradle(Module:app)ファイルのjavaMaxHeapsizeを増やします。

dexOptions {
    javaMaxHeapSize "1g"
}

to(gradleでこの行を追加)

 dexOptions {
        javaMaxHeapSize "4g"
    }
4
saigopi

私のMacBookを再起動すると、この問題は解決しました。

1
Thomas

gradle.propertiesファイルにこれを追加して、メモリ割り当てとヒープサイズを増やすこともできます。

org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g

2048Mと32gである必要はありません。好きなだけ大きくしてください。

1
John Doe

Jdeveloperでメモリサイズを増やす必要があります setDomainEnv.cmd

set WLS_HOME=%WL_HOME%\server    
set XMS_Sun_64BIT=**256**
set XMS_Sun_32BIT=**256**
set XMX_Sun_64BIT=**3072**
set XMX_Sun_32BIT=**3072**
set XMS_JROCKIT_64BIT=**256**
set XMS_JROCKIT_32BIT=**256**
set XMX_JROCKIT_64BIT=**1024**
set XMX_JROCKIT_32BIT=**1024**

if "%Java_VENDOR%"=="Sun" (
    set WLS_MEM_ARGS_64BIT=**-Xms256m -Xmx512m**
    set WLS_MEM_ARGS_32BIT=**-Xms256m -Xmx512m**
) else (
    set WLS_MEM_ARGS_64BIT=**-Xms512m -Xmx512m**
    set WLS_MEM_ARGS_32BIT=**-Xms512m -Xmx512m**
)

そして

set MEM_PERM_SIZE_64BIT=-XX:PermSize=**256m**
set MEM_PERM_SIZE_32BIT=-XX:PermSize=**256m**

if "%Java_USE_64BIT%"=="true" (
    set MEM_PERM_SIZE=%MEM_PERM_SIZE_64BIT%
) else (
    set MEM_PERM_SIZE=%MEM_PERM_SIZE_32BIT%
)

set MEM_MAX_PERM_SIZE_64BIT=-XX:MaxPermSize=**1024m**
set MEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=**1024m**
0
shashi

私はAndroid Studioで作業しており、署名付きAPKをリリース用に生成しようとしたときにこのエラーが発生しました。私は問題なくデバッグAPKをビルドしてテストすることができましたが、リリースAPKをビルドするとすぐにビルドプロセスが数分間実行され、最後にエラーError.lang.OutOfMemoryError:GCで終了しますオーバーヘッド制限を超えました "#:。 VMとAndroid DEXコンパイラの両方のヒープサイズを増やしましたが、問題は解決しませんでした。最後に、何時間ものコーヒーのマグカップの後、問題は私のアプリレベルの 'build.gradle'ファイルにあることが判明しました。コードを縮小するプロセスを経ていないコードについて( https://developer.Android.com/studio/build/shrink-code.html を参照)。 'minifyEnabled'パラメータを 'true'に変更し、リリースビルドを夢のように実行しました:)

要するに、私は自分のアプリレベルの 'build.gradle'ファイルを//から変更する必要がありました。

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.sign_config_release
    }
    debug {
        debuggable true
        signingConfig signingConfigs.sign_config_debug
    }
}

//...

    //...

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.sign_config_release
    }
    debug {
        debuggable true
        signingConfig signingConfigs.sign_config_debug
    }
}

//...
0

IntelliJ IDEAでヒープサイズを増やすには、次の手順に従います。それは私のために働きました。

Windowsユーザーの場合

IDEがインストールされている場所に移動し、以下を検索します。

idea64.exe.vmoptions

ファイルを編集して以下を追加します。

-Xms512m
-Xmx2024m
-XX:MaxPermSize=700m
-XX:ReservedCodeCacheSize=480m

それだ !!

0
Dulith De Costa