Bom dia. Eu estou desenvolvendo uma aplicação que faz a manipulação de grandes informações de texto em um banco de dados. O problema, é que tenho um laço que faz inserções e ele gera muito lixo a cada iteração. Com tempo passei a ter o famoso erro de java.lang.OutOfMemoryError: Java heap space, ou seja, o espaço do heap se esgotou. A primeira alternativa para solucionar isso foi chamar o GC ao final de cada iteração com:
System.gc();
Sei que isso não é garantia de que ele irá passar, mas requisitando ele com grande frequencia, resolveu meu problema. Mas a aplicação ficou insuportavelmente lenta. Dai pensei, vou monitorar o espaço livre no heap, com:
long tamanhoHeap = Runtime.getRuntime().totalMemory();
long tamanhoMaxHeap = Runtime.getRuntime().maxMemory();
long tamanhoLivreHeap = Runtime.getRuntime().freeMemory();
para que quando ele chegue a um limite próximo do mínimo, eu chame o GC, melhorando assim a performace e diminuindo as chamadas desnecessárias. Algo do tipo:
if(tamanhoLivreHeap < algumTamanho){
System.gc();
}
Deu java.lang.OutOfMemoryError: Java heap space de novo, pois o GC não passava naquele exato momento.
Tentei então uma terceira alternativa, que seria a cada iteração, verificar a quantidade de espaço livre, e se ela estiver abaixo de um patamar, segurar a execução em um laço, até que o GC passe e libere mais memória. Algo do tipo:
while(tamanhoLivreHeap < algumTamanhoX);
Mas isso congela a aplicação. Alguém teria mais alguma sugestão?
Desde já agradeço!