错误java.lang.OutOfMemoryError:超出GC开销限制
我在执行JUnit测试时收到此错误消息:错误java.lang.OutOfMemoryError:超出GC开销限制,java,garbage-collection,out-of-memory,heap-memory,Java,Garbage Collection,Out Of Memory,Heap Memory,我在执行JUnit测试时收到此错误消息: java.lang.OutOfMemoryError: GC overhead limit exceeded 我知道什么是OutOfMemoryError,但GC开销限制意味着什么?如何解决此问题?此消息意味着由于某种原因,垃圾收集器占用了过多的时间(默认情况下占进程所有CPU时间的98%),并且在每次运行中恢复的内存很少(默认情况下占堆的2%) 这实际上意味着您的程序停止执行任何进度,并且始终只忙于运行垃圾收集 为了防止应用程序在没有完成任何工作的情
java.lang.OutOfMemoryError: GC overhead limit exceeded
我知道什么是
OutOfMemoryError
,但GC开销限制意味着什么?如何解决此问题?此消息意味着由于某种原因,垃圾收集器占用了过多的时间(默认情况下占进程所有CPU时间的98%),并且在每次运行中恢复的内存很少(默认情况下占堆的2%)
这实际上意味着您的程序停止执行任何进度,并且始终只忙于运行垃圾收集
为了防止应用程序在没有完成任何工作的情况下占用CPU时间,JVM抛出这个错误
,以便您有机会诊断问题
我见过这种情况的罕见案例是,一些代码在已经非常内存受限的环境中创建了大量临时对象和大量弱引用对象
查看Java GC调优指南,该指南可用于各种Java版本,并包含有关此特定问题的部分:
- 为不同的垃圾收集器提供了关于过量GC的专用部分:
- 为了
- 为了
- 没有提到垃圾优先(G1)收集器的这种特定错误情况
- 及其
- 和它的
-XX:-usegcoveredlimit
来禁用此功能
编辑:看起来有人打字比我快:)通常是代码。下面是一个简单的例子:
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");
}
}
然后查看gc.log
- 使用坏方法触发444次
- 使用更差的方法触发666次
- 使用更好的方法触发354次
现在可以肯定的是,这不是最好的测试或最好的设计,但是当您面临除了实现这样一个循环之外别无选择的情况时,或者在处理表现糟糕的现有代码时,选择重用对象而不是创建新对象可以减少垃圾收集器妨碍的次数…如果您确定程序中没有对象,请尝试:
-Xmx1g
李>
-XX:+UseConMarkSweepGC
李>
如有必要,可以通过在命令行中添加选项
-XX:-usegcoveredlimit
来禁用堆大小。只需在
跑→ 运行配置→ 论据→ VM参数
-Xms1024M-Xmx2048M
Xms-最低限度
Xmx-对于我的最大限制,以下步骤有效:
eclipse.ini
文件-Xms40m
-Xmx512m
到
-Xms512m
-Xmx1024m
根据以下内容确定错误原因:(添加了强调和换行符) […]“超出了GC开销限制”表示垃圾收集器一直在运行,Java程序进展非常缓慢 在垃圾收集之后,如果Java进程花费大约98%的时间进行垃圾收集,并且恢复的堆不到2%,并且一直在进行最后5次(编译时常量)连续垃圾收集,则会抛出
Java.lang.OutOfMemoryError
。[……]
Xms1g-Xmx2g
设置堆内存外,还可以尝试
-XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m
-XX:ParallelGCThreads=n -XX:ConcGCThreads=n
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**
)
及
试试这个
打开build.gradle
文件
android {
dexOptions {
javaMaxHeapSize = "4g"
}
}
以下几点对我有用。只需添加以下代码段:
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(模块:app)文件中增加javaMaxHeapsize 至(在渐变中添加此行)
在Netbeans中,设计最大堆大小可能会有所帮助。转到运行=>设置项目配置=>自定义。在弹出窗口的运行中,转到VM选项,填写
-Xms2048m-Xmx2048m
。它可以解决堆大小问题。我在Android Studio工作,在尝试生成用于发布的签名APK时遇到此错误。
我能够毫无问题地构建和测试调试APK,但只要我想构建发布APK,构建过程就会连续运行几分钟,最后以“Error java.lang.OutOfMemoryError:超出GC开销限制”结束。我增加了VM和Android DEX编译器的堆大小,但问题仍然存在。
最后,经过几个小时和几杯咖啡之后,我发现问题出在我的应用程序级别的“build.gradle”文件中——我有“minifyEnabled”参数
android {
dexOptions {
javaMaxHeapSize = "4g"
}
}
android {
compileSdkVersion 25
buildToolsVersion '25.0.1'
defaultConfig {
applicationId "yourpackage"
minSdkVersion 10
targetSdkVersion 25
versionCode 1
versionName "1.0"
multiDexEnabled true
}
dexOptions {
javaMaxHeapSize "4g"
}
}
dexOptions {
javaMaxHeapSize "1g"
}
dexOptions {
javaMaxHeapSize "4g"
}
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
}
}
//...
idea64.exe.vmoptions
-Xms512m
-Xmx2024m
-XX:MaxPermSize=700m
-XX:ReservedCodeCacheSize=480m
-Xms size in bytes
Example : java -Xms32m
-Xmn size in bytes
Example : java -Xmx2m
-Xmx size in bytes
Example : java -Xmx2048m