Problemas com java.lang.OutOfMemoryError

Bom dia! :smiley:
Tenho uma aplicação console que roda em um servidor incianco o servico com o seguinte comando:

java -Xmx200m -jar Middleware.jar

Essa app faz uma série de ações de pesquisa e updates no oracle, pegando umas telas do mainframe.
Cerca de 12 a 15 horas depois de rodando, recebo o seguinte erro:

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

Já revi o código(não vou colocar aqui pq é mto exenso) e parece que não há nada de errado.
Como posso fazer para saber oq exatamente está acontecendo? Seria algum tipo de profiler ou algo assim? Com qual ferramenta consigo analizar a aplicação e ver oq está consumindo mais memória?
Muito obrigado :slight_smile:

Bom, deve ter algo que você está utilizando que está alocando memória e não está desalocando. Colocque um contador de memória no seu aplicativo.

http://www.guj.com.br/java.tutorial.artigo.129.1.guj

Veja também o tutorial de GC.

http://www.guj.com.br/java.tutorial.artigo.28.1.guj

Da pra melhorar a sua configuração:

Experimetne algo como
-Xmx200m -Xms200m

Isto irá fazer com que a aplicação não só inicie sabendo que pode usar no máximo 200 Mb de memória, comoq ue também já a inicia com os 200 Mb cacheados para ela.

No Java 6 o OutOfMemoryError dá mais detalhes do que está acontecendo. Dependendo do caso até a linha que causou o estrago.

Definitivamente você precisa de um profiler, embora se sua aplicação acessa o banco de dados, exista 99,99% de chances de ser seu código de acesso ao banco o culpado. Use o NetBeans Profiler ou outra ferramenta similar e acompanhe os gráficos de instâncias criadas x residentes em RAM.

[quote=mister__m][quote=andre_a_s]
Como posso fazer para saber oq exatamente está acontecendo? Seria algum tipo de profiler ou algo assim? Com qual ferramenta consigo analizar a aplicação e ver oq está consumindo mais memória?
[/quote]

Definitivamente você precisa de um profiler, embora se sua aplicação acessa o banco de dados, exista 99,99% de chances de ser seu código de acesso ao banco o culpado. Use o NetBeans Profiler ou outra ferramenta similar e acompanhe os gráficos de instâncias criadas x residentes em RAM.[/quote]

No caso vc diz que provavelmente o gargalo é na parte do banco, o que poderia ser? Conexões não fechadas? Resultsets? Statements?
Obrigado pelas dicas :slight_smile:

Esse gargalo é (obviedade) de consumo de memória. Verifique se você não está cacheando muita coisa, recebendo recordsets muito grandes e/ou o tempo todo sem fechar os anteriores…

Grande Mister M :slight_smile:
Era isso mesmo, não estava fechando alguns PreparedStaments, Connections e ResultSets.
Muito obrigado, agora está rodando a mais de 50 horas somente com 64mb :smiley: