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
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.
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(Locale.US, “%.2f”, dados.getValorContabil())), 16, “0”);
linha += " ";
linha += dados.getHistorico();
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.
tentei com ele, tentei com o buffer, mais sem resultado
Tente aumentar a memória da JVM na execução do seu processo.
ou
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
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…