Eu estou tentando executar um teste simples JUnit que inclui o seguinte código:
@Test
public void testVeryLongString() {
String s = "0123456789";
String repeated = new String(new char[214748364]).replace("\0", s);
assertEquals(2147483640, repeated .length());
}
Ele falha nas linhas acima com "o tamanho da matriz solicitada excede o limite VM".
Tentei aumentar a configuração Run deste teste para -Xmx18292m (em uma estação de trabalho 64GB Windows), mas ainda estou recebendo o temido "tamanho da matriz pedida excede limite VM".
o que estou perdendo?
Existe uma maneira de deixar o teste prosseguir sem falhar neste limite VM?
O tamanho da matriz pedida excede limite VM significa que uma maior variedade do queInteger.MAX_VALUE
é tentada a ser alocado. Como Java 9String
eStringBuilder
(o que é utilizado paraString.replace(...)
) utilizar internamente cada uma matriz de bytes duas vezes o tamanho do comprimento da cadeia , em vez de umachar
matriz com o mesmo comprimento.
Com Java 8 e memória suficiente (muito mais do que -Xmx18292m
como matrizes adicionais são necessárias para fazer String.replace(...)
) para evitar um OutOfMemoryError
, ele deve funcionar .
Para um melhor desempenho e requisitos de memória menos, utilize o seguinte código:
@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
}