Exception java.lang.OutOfMemoryError: ao inserir dados em tabela

5 respostas
pyro

Estou com uma aplicação lendo dados em uma tabela e jogando em outra, o trecho do código é o seguinte:

while(rs.next()){
  stm.setString(1, rs.getString(campo1));
  stm.setString(2, rs.getString(campo2));
  stm.setString(3, rs.getString(campo3));
  stm.addBatch();
}
stm.executeBatch();

Isso tem funcionado exatamente da mesma maneira, porém em determinada tabela dispara a seguinte exception:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Analisando, essa tabela retorna 136.000 linhas que deverão ser inseridas na outra tabela. É uma limitação pelo grande volume de linhas? Se for limitação tem como contornar isso?

5 Respostas

kaique

Cara, o teu problema é que a memória que o Java está usando da sua máquina é insuficiente para essa operação.
Não sei se seria a sua melhor saída, mas acho que se voc~e aumentar a memória que sua aplicação pode consumir, vai resolver o seu problema. Acho que essa seria a solução mais rápida de implementar…
Pesquisa pelos parâmetros -Xms e -Xmx que podem ser passados para a VM…

[]'s.

K

Kaique,
se vc utiliza o tomcat caso seja uma aplicacao WEB mude o valor “Initial memory pool” e “Maximum memory pool” na guia JAVA do monitor do tomcat
http://cephas.net/blog/2005/03/16/modifying-memory-allocation-on-tomcat-5x-on-windows/

se for aplicacao desktop utiliza na comando de execucao “java aplicacao.jar -Xmx 999 - Xms 999” , 999 seria o valor que vc vai alocar de memoria

[]s

wanderley.drumond

Tem como gerenciar isso pelo painel de controle ( se estiver utilizando windows).
Painel de controle -> java -> na aba general vá em temporarity internet files clique em settings -> Lá embaixo em disk space vc pode dar compressão aos arquivos .jar (mas não recomendo, irá deixar sua máquina mais lenta - Clique em delete files -> OK (com as duas opções marcadas).

Giulliano

Não acho q a solução seja aumentar sua memória…talvez colocar isso em threads separadas ou dividir em alguns fors seria uma solução mais plausível…

pyro

Valeu pelas explicações.
Como solução achei mais perfomático dentro do while() colocar um if() com um contador disparando o executeUpdate e após isso limpando com clearBatch() e continuando o laço. Tá funcionando legal.

Criado 6 de fevereiro de 2008
Ultima resposta 7 de fev. de 2008
Respostas 5
Participantes 5