当前位置: 代码迷 >> java >> 超出Junit java.lang.OutOfMemoryError GC开销限制
  详细解决方案

超出Junit java.lang.OutOfMemoryError GC开销限制

热度:70   发布时间:2023-07-17 20:06:29.0

我有以下用于JUnit测试的@Before方法:

List<MyClass> allCombinations = new ArrayList<>();

@Before
public void generateCombinations() {
    int index = 0;
    char[] binaryChars = null;
    MyClass myMockObj = mock(MyClass.class);
    for (int i = 0; i < Math.pow(2, 15); i++) {
        binaryChars = StringUtils.leftPad(Integer.toBinaryString(i), variables).toCharArray();
        when(myMockObj.method1()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method2()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method3()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method4()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method5()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method6()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method7()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method8()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method9()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method10()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method11()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method12()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method13()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method14()).thenReturn(binaryChars[index++] == '0');
        when(myMockObj.method15()).thenReturn(binaryChars[index++] == '0');
        allCombinations.add(myMockObj);
        index = 0;
    }
}

此方法引发以下错误:

java.lang.OutOfMemoryError: GC overhead limit exceededClose stacktrace
at java.util.Arrays.copyOf(Arrays.java:3236)

我从了解错误是什么。 但是,我不知道上面代码中出现此错误的原因。

JUnit一个有趣的功能是,它为您运行的每个测试用例创建一个测试类的实例,并且在所有测试都运行完之后,这些实例才会发布给GC。

因此,如果您在测试用例中为实例变量分配了很多数据(例如在每个测试之前运行的generateCombinations方法中),则必须在测试之后手动释放数据。

尝试添加方法

@After
public void cleanup() {
    allCombinations  = null;
}

我们已经制作了一个工具,可以自动进行反射。

如果清理测试类无济于事,那么您只需要向它扔更多的内存即可。

  相关解决方案