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

超出Junit java.lang.OutOfMemoryError GC开销限制,java,junit,garbage-collection,Java,Junit,Garbage Collection,对于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

对于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;
    }
}

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

JUnit的一个有趣特性是,它为您运行的每个测试用例创建一个测试类实例,并且在所有测试都运行之前,这些实例不会为GC发布

因此,如果您将大量数据分配给测试用例中的实例变量(如在每次测试之前运行的generateCombinations方法),那么您必须在测试之后手动释放数据

尝试添加一个方法

@After
public void cleanup() {
    allCombinations  = null;
}
我们制作了一个工具,可以通过反射自动实现这一点


如果清理测试类没有帮助,那么您只需要向它投入更多内存…

JUnit的一个有趣特性是,它为您运行的每个测试用例创建一个测试类实例,并且在所有测试都运行之前,这些实例不会为GC释放

因此,如果您将大量数据分配给测试用例中的实例变量(如在每次测试之前运行的generateCombinations方法),那么您必须在测试之后手动释放数据

尝试添加一个方法

@After
public void cleanup() {
    allCombinations  = null;
}
我们制作了一个工具,可以通过反射自动实现这一点


如果清理测试类没有帮助,那么你只需要向它投入更多内存…

如果你将
Math.pow(2,15)
更改为例如10,那么你不会得到错误,对吗?@显然,这个数字越小,我停止出错的机会就越大,因为循环运行的次数就会少很多。如何使用幂15进行求解?如果将
Math.pow(2,15)
更改为例如10,则不会出现错误,对吗?@显然,该数字越小,我停止出错的可能性就越大,因为循环运行的次数会少很多。我如何用power 15解决问题?“JUnit的一个有趣的特性是它创建了…”难道它不应该像“JUnit的一个不负责任的错误是它创建了…”如果它每次都创建一个新实例而没有清理,那么它就是JUnit中的一个错误。。我听说这个bug在最新版本中已经修复了,但我仍然在Junit jupiter中得到了解决……”Junit的一个有趣的特性是它创建了……”难道它不应该像“Junit的一个不负责任的bug就是它创建了……”如果它每次都创建一个新实例而没有清理,那么它就是Junit中的一个bug。。我听说这个bug在最新版本中已经修复了,但我仍然在JUnitJupiter中得到了它。。。