当我执行JUnit测试时,我得到了这个错误消息:

java.lang.OutOfMemoryError: GC overhead limit exceeded

我知道什么是OutOfMemoryError,但是GC开销限制意味着什么?我怎么解决这个问题?


当前回答

我在使用Oracle web逻辑服务器时得到了这个错误。我分享我的答案作为参考,以防有人最终在这里寻找解决方案。

所以,如果你试图提升Oracle web逻辑服务器并得到这个错误,那么你只需要增加运行服务器的初始和最大堆大小。

转到- > C:\Oracle\Middleware\Oracle_Home\user_projects\domains\wl_server\bin 打开setDomainEnv.cmd 检查设置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

edit:检查您是否能够在运行服务器时看到更新的java参数。就像这样 如果它像以前一样,那么替换setDoaminEnv中显示的值。CMD由简单的搜索和替换。

其他回答

在Netbeans中,设计最大堆大小可能会有所帮助。执行命令Run =>设置项目配置=>自定义。在弹出窗口的运行中,进入虚拟机选项,填写-Xms2048m -Xmx2048m。它可以解决堆大小的问题。

通常是代码。这里有一个简单的例子:

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");
    }
}

在Windows 7 32位操作系统上使用Java 1.6.0_24-b07。

java -Xloggc:gc.log GarbageCollector

然后查看gc.log

使用BAD方法触发444次 使用WORSE方法触发666次 使用BETTER方法触发354次

现在承认,这不是最好的测试或最好的设计,但当你面临别无选择只能实现这样的循环或处理行为糟糕的现有代码时,选择重用对象而不是创建新对象可以减少垃圾收集器阻碍的次数……

您还可以通过将此添加到gradle中来增加内存分配和堆大小。属性文件:

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

它不需要2048M和32g,你想要多大就有多大。

如果您确定程序中没有内存泄漏,请尝试:

增加堆的大小,例如-Xmx1g。 启用并发低暂停收集器-XX:+UseConcMarkSweepGC。 在可能的情况下重用现有对象以节省内存。

如果需要,可以通过在命令行中添加-XX:-UseGCOverheadLimit选项来禁用限制检查。

您可以尝试通过参考此映像来更改服务器设置,并增加用于处理的内存大小 流程更改以黄色突出显示

你也可以通过打开cmd-> set _java_opts - xmx2g来改变java堆 2g(2gb),这取决于程序的复杂程度

尽量少使用常数变量和临时变量