Memória do Tomcat sobe e nao desce mais, lerdiando a aplicação

Ola amigos do Guj!!

Estou a muito tempo procurando uma soluçao para um problema na aplicacao do tomcat da minha empresa, por isso peço ajuda aos meus amigos do GUJ.

Primeiro irei explicar a situaçao que me passa:
O tomcat roda num servidor com windows 2003 server, 4 gb ram, e processador de 8 nucleos.
Em torno de 50 usuarios acessam a aplicacao, nao necessariamente ao mesmo tempo.
Tomcat: 5.5
Sistema: ERP

Problema:
Normalmente o tomcat esta estavel com memoria em torno de 300mb no taskmanager do windows e aplicaçao esta rapida, porem em algum instante a memoria começa a subir aproximadamente até 900mb e entao a aplicacao fica lenta ao ponto de ter que reiniciar o serviço do tomcat.
Ja foi ajustado as diretivas de memoria para nao dar OutOfMemory, mas isso da no mesmo pois tenho que reiniciar o tomcat toda vez que chega perto de 900mb.

Ja colocamos o Probe para tentar identificar o problema caso fosse a programaçao no contexto mas sem sucesso, pois nao da para identificar o que causa o aumento repentino.
No Probe podemos forçar o gardbage colletor, mas é a mesma coisa que nada, pois nao diminui a memoria acusada no taskmanager.

Li a um tempo num comentario de forum, que isso era um bug do tomcat no gerenciamento de memoria Heap (aquela que guarda as classes e os metodos)

Entao esta aí minha pergunta: O que fazer?

Osmar Maciel Rehbein

Isso é um memory leak da sua aplicação. Use a jvisualvm.
Um leak é um recurso que é alocado em memória e não é liberado. Poser ser uma Lista que você esqueceu de gerenciar a quantidade de objetos ou qualquer outra coisa do gênero.

https://visualvm.dev.java.net/

Olha eu tive uns problemas aki, mas eu consegui melhorar pescando na web ! Vou ti mostrar e veja se ajuda para voce.

<?xml version=“1.0” encoding=“ISO-8859-1”?>
[color=blue]<Context path="/meusite" docBase=“meusite” debug=“5” reloadable=“true” crossContext=“true”>
[/color] <Resource
auth=“Container”
driverClassName=“com.mysql.jdbc.Driver”
maxActive=“40000”
maxIdle=“200”
maxWait=“10000”
name=“jdbc/minhaconexao”
type=“javax.sql.DataSource”
url=“jdbc:mysql://200.168.0.1/jes?autoReconnect=true”
username=“usuario”
password=“senha” />
</Context>

flw

[quote=Lindberg]Olha eu tive uns problemas aki, mas eu consegui melhorar pescando na web ! Vou ti mostrar e veja se ajuda para voce.

<?xml version=“1.0” encoding=“ISO-8859-1”?>
[color=blue]<Context path="/meusite" docBase=“meusite” debug=“5” reloadable=“true” crossContext=“true”>
[/color] <Resource
auth=“Container”
driverClassName=“com.mysql.jdbc.Driver”
maxActive=“40000”
maxIdle=“200”
maxWait=“10000”
name=“jdbc/minhaconexao”
type=“javax.sql.DataSource”
url=“jdbc:mysql://200.168.0.1/jes?autoReconnect=true”
username=“usuario”
password=“senha” />
</Context>

flw[/quote]

Se for um leak não importa a quantidade de momória que se tenha. Ela vai estourar.

Tomcat tem um histórico nada favorável de memory leaks.
Até hoje eles ainda estão corrigindo alguns no Tomcat 6. Na versão 5.5 deve ser pior ainda.
Falo isso de cadeira, pois acompanho os commits do pessoal da Apache diariamente, e no mínimo uma vez por semana vem um commit com alguma correção de memory leak.
O Tomcat 7 teve muito coisa remodelada, e já é para nascer com muito menos leaks desse tipo.

Vc já reparou se esse aumento expressivo de memória é somente após alguma operação? Ou essa quantidade de memória sobe de forma cadenciada e suave?
Nos dê mais características do seu problema com o Tomcat e talvez possamos lhe ajudar melhor. :wink:
Ou melhor ainda: use algum software para analisar a memória da sua aplicação.
Acredito que o jVisualVM seja uma boa opção.

[quote=clone_zealot]Tomcat tem um histórico nada favorável de memory leaks.
Até hoje eles ainda estão corrigindo alguns no Tomcat 6. Na versão 5.5 deve ser pior ainda.
Falo isso de cadeira, pois acompanho os commits do pessoal da Apache diariamente, e no mínimo uma vez por semana vem um commit com alguma correção de memory leak.
O Tomcat 7 teve muito coisa remodelada, e já é para nascer com muito menos leaks desse tipo.

Vc já reparou se esse aumento expressivo de memória é somente após alguma operação? Ou essa quantidade de memória sobe de forma cadenciada e suave?
Nos dê mais características do seu problema com o Tomcat e talvez possamos lhe ajudar melhor. :wink:
Ou melhor ainda: use algum software para analisar a memória da sua aplicação.
Acredito que o jVisualVM seja uma boa opção.[/quote]

Acredito que se o leak estivesse no tomcat teríamos muito mais tópicos sobre o assunto. Ele deve estar na aplicação mesmo.

Olha, uma coisa simples que é um leak

List mlsLista…

mlsLista.add(algumObjeto);

se você se esquecer de deletar os objetos, uma hora dessas sua aplicação estoura o heap.

Obrigado juliocbq, provavelmente deve ser isso mesmo, pois o nosso sistema esta cheio de HashMap e ArrayList. Mas ainda vou fazer alguns testes para confirmar, pois o tenho duvida quanto ao HashMap ser um objeto local, no meu entender o objeto local tambem deveria ser destruido pelo GC com seus objetos contidos.

Pensava que o Garbagage Coletor ao destruir um objeto tipo List, acabava excluindo seus objetos contidos. Ao certo nao deveria funcionar assim ou é uma falha do tomcat ou java?

Mesmo sendo isso, problema é resolver e detectar em todo canto do codigo.

Obrigado pela ajuda

att Osmar

[quote=osmarrehbein]Obrigado juliocbq, provavelmente deve ser isso mesmo, pois o nosso sistema esta cheio de HashMap e ArrayList. Mas ainda vou fazer alguns testes para confirmar, pois o tenho duvida quanto ao HashMap ser um objeto local, no meu entender o objeto local tambem deveria ser destruido pelo GC com seus objetos contidos.

Pensava que o Garbagage Coletor ao destruir um objeto tipo List, acabava excluindo seus objetos contidos. Ao certo nao deveria funcionar assim ou é uma falha do tomcat ou java?

Mesmo sendo isso, problema é resolver e detectar em todo canto do codigo.

Obrigado pela ajuda

att Osmar[/quote]

O coletor de lixo só cuida da chamada raw data( Ponteiros diretamente na memória). Se você criar uma lista, e ela estiver referenciada por algum objeto, o coletor nem saberá da sua existência. Então ela vai crescer indefinidamente.

Isso quer dizer que ganhamos somente em não precisar usar um delete depois de um [b]new/b, mas precisamos ficar atentos aos nossos objetos de vida longa.