Как увеличить размер памяти виртуальной машины для теста JUnit на Eclipse? - PullRequest
1 голос
/ 28 октября 2019

Я пытаюсь запустить простой тест JUnit, который включает следующий код:

    @Test
    public void testVeryLongString() {
            String s = "0123456789";
            String repeated = new String(new char[214748364]).replace("\0", s);
            assertEquals(2147483640, repeated .length());
   }

Сбой в приведенных выше строках с "Запрошенный размер массива превышает ограничение ВМ".

Iпопытался увеличить конфигурацию запуска этого теста до -Xmx18292m (на рабочей станции Windows 64 ГБ), но я все еще получаю страшное «Запрашиваемый размер массива превышает ограничение виртуальной машины».

Чего мне не хватает?

Есть ли способ позволить тесту продолжаться без сбоев на этом ограничении виртуальной машины?

1 Ответ

4 голосов
/ 29 октября 2019

Размер запрашиваемого массива превышает ограничение виртуальной машины. означает, что попытка выделения массива превышает Integer.MAX_VALUE. Поскольку Java 9 String и StringBuilder (что используется для String.replace(...)), для внутреннего использования каждый массив байтов размером в два раза больше длины строки вместо charмассив той же длины.

С Java 8 и достаточным объемом памяти (намного больше, чем -Xmx18292m, поскольку для выполнения String.replace(...) требуются дополнительные массивы), чтобы избежать OutOfMemoryError, должно работать .

Для лучшей производительности и меньших требований к памяти используйте следующий код:

@Test
public void testVeryLongString() {
    String s = "0123456789";
    char[] chars = new char[214_748_364 * s.length()]; // Java 9+: 107_374_182
    for (int i = 0; i < chars.length; i += s.length()) {
        for (int j = 0; j < s.length(); j++) {
            chars[i+j] = s.charAt(j);
        }
    }
    String repeated = new String(chars);
    assertEquals(2_147_483_640, repeated.length()); // Java 9+: 1_073_741_820
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...