Размер запрашиваемого массива превышает ограничение виртуальной машины. означает, что попытка выделения массива превышает 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
}