Junit java.lang.OutOfMemoryError Превышен лимит накладных расходов GC - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть следующий @Before метод для теста JUnit:

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)

Я понимаю из здесь в чем ошибка.Тем не менее, я не знаю причину в приведенном выше коде для получения этой ошибки.

1 Ответ

0 голосов
/ 21 февраля 2019

Интересной особенностью JUnit является то, что он создает экземпляр класса теста для каждого запускаемого вами теста, и эти экземпляры не освобождаются для GC, пока не будут выполнены все тесты.

Таким образом, если вывыделите много данных для переменных экземпляра в вашем тестовом примере (как в методе generateCombitions, который запускается перед каждым тестом), вам нужно вручную деблокировать данные после теста.

Попробуйте добавить метод

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

Мы создали инструмент, который делает это автоматически с отражением.

Если очистка тестовых классов не помогает, тогда вам просто нужно добавить больше памяти ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...