Java错误:java.lang.OutOfMemoryError:GC超时限制已超出

956

当我执行我的JUnit测试时,会遇到这个错误信息:

java.lang.OutOfMemoryError: GC overhead limit exceeded

我知道什么是OutOfMemoryError,但是GC overhead limit是什么意思?我该如何解决这个问题?


18
听起来很有趣。我希望有人能够发布生成这个的代码。 - Buhb
2
我简单地找到了问题,导致内存使用过多,接近堆的限制。一个简单的解决方案可能是给Java引擎一些更多的堆内存(-Xmx),但这只有在应用程序需要与之前设置的堆限制完全相同的内存才有效。 - Mnementh
16
请注意,有多种“OutOfMemoryError”情况,增加堆大小并不是有效的解决方案:耗尽本地线程和耗尽PermGen(与堆分开)是其中的两个示例。在涉及“OutOfMemoryErrors”时要小心,因为会导致它们的原因非常多样化,不要发表过于笼统的陈述。 - Tim
3
你是如何解决这个问题的? - Thorsten Niehues
2
这个错误在我使用Jdk1.8.0_91时发生并仍在发生。 - Parasu
显示剩余6条评论
23个回答

8

已解决:
只需在 gradle.properties 文件中添加 org.gradle.jvmargs=-Xmx1024m,如果不存在,则创建该文件。


6

您还可以通过将以下内容添加到gradle.properties文件中来增加内存分配和堆大小:

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

它不必是2048M和32g,可以根据需求进行调整。


5

Java堆大小描述(xms,xmx,xmn)

-Xms size in bytes

Example : java -Xms32m

设置Java堆的初始大小。 默认大小为2097152 (2MB)。 这些值必须是1024字节(1KB)的倍数且大于1024字节。 (-server标志将默认大小增加到32M。)

-Xmn size in bytes

Example : java -Xmx2m

设置新生代Eden区的初始Java堆大小。默认值为640K。 (-server标志将默认大小增加到2M。)

-Xmx size in bytes

Example : java -Xmx2048m

设置Java堆可以增长到的最大大小。 默认大小为64M。(-server标志将默认大小增加到128M。) 最大堆限制约为2GB(2048MB)。

Java内存参数(xms、xmx、xmn)格式化

在设置Java堆大小时,应使用字母“m”或“M”表示MB,或使用“g”或“G”表示GB,指定您的内存参数。如果指定“MB”或“GB”,则设置无效。有效的参数如下所示:

-Xms64m或-Xms64M -Xmx1g或-Xmx1G 也可以使用2048MB来指定2GB 此外,请确保在指定参数时仅使用整数。使用-Xmx512m是一个有效的选项,但使用-Xmx0.5g会导致错误。

本参考资料对于某些人来说可能很有帮助。


2

要在IntelliJ IDEA中增加堆大小,请按照以下说明进行操作。这对我很有效。

对于Windows用户,

转到IDE安装的位置并搜索以下内容。

idea64.exe.vmoptions

编辑文件并添加以下内容。
-Xms512m
-Xmx2024m
-XX:MaxPermSize=700m
-XX:ReservedCodeCacheSize=480m

这就是它!!

1
我正在使用Android Studio工作,在尝试生成已签名的发布APK时遇到了错误。 我能够轻松构建和测试调试APK,但是一旦我想要构建发布APK,构建过程就会持续几分钟,最终以"Error java.lang.OutOfMemoryError: GC overhead limit exceeded"终止。我增加了虚拟机和Android DEX编译器的堆大小,但问题仍然存在。 最后,在经过多个小时和许多杯咖啡后,问题出现在我的应用级'build.gradle'文件中 - 我将'release'构建类型的'minifyEnabled'参数设置为'false',因此在未经过缩小代码处理的代码上运行Proguard(请参见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
    }
}

//...

1
我在使用Oracle Web Logic服务器时遇到了这个错误。如果有人在寻找解决方案时来到这里,我分享一下我的答案供参考。
所以,如果您正在尝试启动Oracle Web Logic服务器并遇到此错误,则只需增加运行服务器设置的初始和最大堆大小即可。
前往 - > C:\Oracle\Middleware\Oracle_Home\user_projects\domains\wl_server\bin 打开setDomainEnv.cmd 检查set USER_MEM_ARGS的值,如果它小于 set USER_MEM_ARGS="-Xms128m – Xmx8192m ${MEM_DEV_ARGS} ${MEM_MAX_PERM_SIZE}"
这意味着您的初始堆大小设置为128 MB,最大堆大小为8GB。 现在,只需保存文件并重新启动服务器。如果无法解决问题,请尝试增加大小或寻找优化服务的方法。
参考资料,请查看此链接: https://docs.oracle.com/cd/E49933_01/server.770/es_install/src/tins_postinstall_jvm_heap.html 编辑:检查是否能够在运行服务器时看到更新的Java参数,就像这样 enter image description here。如果仍然显示之前的值,则通过简单的搜索和替换将setDoaminEnv.cmd中显示的值替换掉。

1
你可以参考这张图片,在服务器设置上进行更改,增加内存处理大小 突出显示的更改在黄色部分
你也可以通过打开cmd并输入set _java_opts -Xmx2g来更改Java堆大小 2g(2千兆字节)根据你的程序复杂性而定
尽量使用较少的常量变量和临时变量

enter image description here


0

@Buhb 我在一个普通的Spring Boot Web应用程序的主方法中,通过以下代码进行了复现:

public static void main(String[] args) {
    SpringApplication.run(DemoServiceBApplication.class, args);
    LOGGER.info("hello.");
    int len = 0, oldlen=0;
    Object[] a = new Object[0];
    try {
        for (; ; ) {
            ++len;
            Object[] temp = new Object[oldlen = len];
            temp[0] = a;
            a = temp;
        }
    } catch (Throwable e) {
        LOGGER.info("error: {}", e.toString());
    }
}

导致错误的示例代码也来自于Oracle Java8语言规范。


0
如果你在这里遇到了TOMCAT中的异常情况,那么这是给你的建议:
当你长时间使用那个tomcat时,可能会发生这种情况。
步骤:
1. 导航到tomcat文件夹(C:/tomcat)。 2. 那里会有一个名为"work"的文件夹,然后是"catalina",再然后是"localHost"。 3. 删除那个localhost文件夹。 4. 在C:/tomcat/webapps中会有一些文件,删除所有文件并重新构建。
现在,堆内存问题应该已经解决了。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接