Estouro de memória

7 respostas
C

Bom dia, estou com um problema de estouro de memória em minha aplicação, resumindo eu tenho um loop de + ou - 300.000 registros e preciso fazer uma concatenação de 20 Strings a cada volta do loop, rodando pelo Netbeans funciona perfeitamente, mas quando executo pelo .jar (dois cliques no executável ambiente windows) ele chega até certo momento e para sem dar excepition, uma coisa que reparei é que se eu executar o jar pelo cmd, utilizando o coma java -jar ele funciona normalmente. Debugando vi que sobe muita memória de char[] e String, então já tentei mudar os tipos de concatenação, usando .concat; +=; StringBuilder; StringBuffer; tudo que eu tentei nada deu certo. Se alguém souber de alguma coisa para ajudar

7 Respostas

jonathan.sky

o problema em si não poderia ser modificado, porque precisa passar de 20 e 20 nos registros? bom de qualquer maneira, mande o código que foi implementado.

C
linha = null;

// StringBuffer str = new StringBuffer(linha);

linha += LC1;

linha += StringUtils.leftPad(String.valueOf(cont), 5, 0);

linha += "   ";

linha += 1;

linha += converte.dataArquivo(dados.getDtLancamento());

linha += StringUtils.leftPad(String.valueOf(dados.getLote()), 6, 0);

linha += "    ";

linha += StringUtils.leftPad(String.valueOf(dados.getLote()), 5, 0);

linha += "                              ";

linha += 000;

linha += StringUtils.leftPad(dados.getContaDebito(), 5, 0);

linha += contaDebitoTerceiro;

linha += "        ";

linha += 00000;

linha += StringUtils.leftPad(dados.getContaCredito(), 5, 0);

linha += contaCreditoTerceiro;

linha += "        ";

linha += 00000;

linha += StringUtils.leftPad(String.valueOf(String.format(<a href="http://Locale.US">Locale.US</a>, %.2f, dados.getValorContabil())), 16, 0);

linha += " ";

linha += dados.getHistorico();
J

olá!

Tente usar o StringBuilder, por ex:

StringBuilder sb = new StringBuilder();
sb.append("LC1").append(StringUtils.leftPad(String.valueOf(cont), 5, "0"))
...
linha = sd.toString();

Acho que desta maneira deve ser mais rápida e economizar memória pq o StringBuilder vai direto no C.

C

tentei com ele, tentei com o buffer, mais sem resultado

J

Tente aumentar a memória da JVM na execução do seu processo.

ou

J

Outro ponto, você pode também mudar a implementação por ex:

  • Descobrir a quantidade de linhas e trabalhar em blocos de 1000 em 1000
C

mesmo mudando as configurações de memória, quando abro o .jar com dois cliques ele vai indo e para, quando executo pelo cmd com o java -jar ele funciona certinho. Agora em questão de bloco de 1000 eu precisaria alterar a minha aplicação, e como não é uma aplicação simples, estou evitando isso pois vc sabe em sistemas maiores como uma coisa reflete a outra, o famoso efeito borboleta…

Criado 18 de maio de 2017
Ultima resposta 18 de mai. de 2017
Respostas 7
Participantes 3