JUnitテストを実行すると、このエラーメッセージが表示されます。
Java.lang.OutOfMemoryError: GC overhead limit exceeded
OutOfMemoryError
はどういう意味ですか?GCオーバーヘッド制限とはどういう意味ですか?どうすればこれを解決できますか?
このメッセージは、何らかの理由でガベージコレクタが過度の時間(デフォルトではプロセスの全CPU時間の98%)を消費し、各実行でごくわずかなメモリしか回復しないことを意味します(デフォルトでは2%のヒープ)。
これは事実上あなたのプログラムがいかなる進行もしなくなり、常にガベージコレクションのみを実行するのに忙しいことを意味します。
アプリケーションが何もしなくてもCPU時間を浪費しないようにするために、JVMはこのError
をスローして、問題を診断できるようにします。
私がこれを見たことがあるまれなケースは、いくつかのコードがすでに非常にメモリに制約された環境で大量の一時的なオブジェクトと大量の弱く参照されたオブジェクトを作成していたところです。
GCは、リターンが少なすぎるためにガベージコレクションに時間がかかりすぎると、この例外をスローします。 CPU時間の98%がGCに費やされ、2%未満のヒープしか回復されません。
この機能は、ヒープが小さすぎるために、ほとんどまたはまったく進まずに、アプリケーションが長時間実行されないようにするためのものです。
コマンドラインオプション-XX:-UseGCOverheadLimit
でこれをオフにすることができます
より多くの情報 ここ
編集:誰かが私よりも速く入力できるように見えます:)
プログラムに メモリリークがないことを確認したら を試してください。
-Xmx1g
のようにヒープサイズを増やします。-XX:+UseConcMarkSweepGC
を有効にします。必要ならば、 limit check をオプション-XX:-UseGCOverheadLimit
をコマンドラインに追加することで無効にすることができます。
通常はコードです。これは簡単な例です:
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を見てください
今は当然のことですが、これは最善のテストや最善の設計ではありませんが、このようなループを実装する以外に選択の余地がない状況や動作が悪い既存のコードを扱う場合ガベージコレクタが邪魔をする回数...
「GCオーバーヘッド制限を超えました」は、ガベージコレクタが常に実行されており、Javaプログラムの進行が非常に遅いことを示しています。
ガベージコレクションの後、Javaプロセスがガベージコレクションの実行時間の約98%以上を費やしている _で、それまでの回復がヒープの2%未満で、これまでに行った場合時定数をコンパイルする)連続したガベージコレクション、そして Java.lang.OutOfMemoryError がスローされる
ヒープメモリを-Xms1g -Xmx2g
で設定することとは別に、試してみてください
-XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m
-XX:ParallelGCThreads=n -XX:ConcGCThreads=n
G1GCに関するその他の関連質問をご覧ください。
このオプションをに設定して、ヒープサイズを少し大きくしてください。
実行→実行設定→引数→VM引数
-Xms1024M -Xmx2048M
Xms - 最小値の場合
Xmx - 上限値の場合
私にとっては、次のステップがうまくいきました。
Eclipse.ini
ファイルを開く変化する
-Xms40m
-Xmx512m
に
-Xms512m
-Xmx1024m
Eclipseを再起動します
次は私のために働いた。次のスニペットを追加するだけです。
Android {
compileSdkVersion 25
buildToolsVersion '25.0.1'
defaultConfig {
applicationId "yourpackage"
minSdkVersion 10
targetSdkVersion 25
versionCode 1
versionName "1.0"
multiDexEnabled true
}
dexOptions {
javaMaxHeapSize "4g"
}
}
これを試して
build.gradle
ファイルを開く
Android {
dexOptions {
javaMaxHeapSize = "4g"
}
}
build.gradle(Module:app)ファイルのjavaMaxHeapsizeを増やします。
dexOptions {
javaMaxHeapSize "1g"
}
to(gradleでこの行を追加)
dexOptions {
javaMaxHeapSize "4g"
}
私のMacBookを再起動すると、この問題は解決しました。
gradle.properties
ファイルにこれを追加して、メモリ割り当てとヒープサイズを増やすこともできます。
org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g
2048Mと32gである必要はありません。好きなだけ大きくしてください。
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**
私は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
}
}
//...
IntelliJ IDEAでヒープサイズを増やすには、次の手順に従います。それは私のために働きました。
Windowsユーザーの場合
IDEがインストールされている場所に移動し、以下を検索します。
idea64.exe.vmoptions
ファイルを編集して以下を追加します。
-Xms512m
-Xmx2024m
-XX:MaxPermSize=700m
-XX:ReservedCodeCacheSize=480m
それだ !!