Tomcat (limpando a memória)

4 respostas
I

Olá. Tenho uma aplicação que pode gerar consultas com muitos dados (mais de 40k registros - para uma página creio que seja) e estes parecem permanecer presos na memória depois do termino da sessão do usuário. Estou usando o display-tag para listar e paginar estes dados. Então ao realizar a consulta estes dados ficam provavelmente na sessão do usuário. Quando a sessão é eliminada (observando pelo manager do Tomcat) , ao olhar o gerenciador de tarefas do Windows, aquele monte de memória alocada continua lá!

Gostaria de saber de que forma posso depurar isto. Estou usando o Tomcat com Struts e não sei como descobrir o que prende estes registros na memória. Isto é algum tipo de cache?

Ainda pelo gerenciador de tarefas do Windows, na parte de processos o Tomcat depois de um tempo aparece usando bem menos memória, mas na parte de “desempenho” o medidor aparece muito alto ainda, na verdade com o mesmo montante.

Se alguém tiver alguma dica ou sugestão de como tratar isto por favor me diga que estou a um bom tempo para descobrir o que pode estar gerando este problema. Grato T+

4 Respostas

dudaskank

Olá

Infelizmente não entendo dessa parte não, hehehe… mas eu apelaria para um System.gc(); mesmo, assim que destruir a sessão.

Aliás, esse tipo de comportamento eu observo também no JBoss e no Eclipse, eles começam o dia um com 100 MB e outro com uns 50 MB acho, agora um tem 127 e outro 110 (apesar que até está baixo, normalmente fica uns 170 pra cada hehehe).

Outra coisa. Colocar 40k registros, com ou sem esse problema de memória, não é uma boa idéia não… é muita memória! Recomendo tentar fazer a paginação de outro modo, nem que seja no braço, para economizar recursos.

flw

I

O esquema da chamada do GC eu já havia tentado sem sucesso. Acabei descobrindo que usando o “-Xincgc” ele diminui as pausas de coleta do GC. Mas mesmo assim a memória fica cheia depois da sessão ter sido destruída. Isso é muito estranho e nem sei onde estes dados ficam retidos. Quanto a quantidade, na verdade o problema é que em média vou ter menos dados mas com muitos usuários. Após eles sairem cada um deixa seu “lixo” pra trás. Meu problema é:

  • Descobrir o que retém estes dados na memória (provavelmente o display tag)
  • Encontrar um meio de limpar após o uso.

Valeu ter respondido, qualquer outra idéia manda aí beleza? Nem que seja um modo de depurar a aplicação para descobrir o problema. T+

dudaskank

Será? Porque não faz muito sentido isso né…

Sei que java deixa na memória enquanto tiver alguém fazendo referência pra ele, então será que sua sessão está mesmo sendo destruída? Lembro de pessoas dizendo que a sessão só é finalizada quando da timeout, ou quando se chama um método que invalida ela acho, não sei o nome…

Nessas horas da uma saudade de usar um malloc()/free() pra ter certeza que liberou a memória né? hehehe

Bom, mais idéias eu realmente acho que não terei, mas se achar algo eu te falo

flw

I

Mas aí é que está a coisa estranha… Eu tenho um “action” de logout para o usuário, apesar de não haver garantias de que o mesmo irá sair da aplicação por ele.

Eu pego a sessão pelo request, chamo o “invalidate()” e ainda atribuo “null” à sessão. Mesmo assim, acompanhando o task manager do Windows, o gráfico de uso de memória fica muito alto ainda. Se desligo o Tomcat simplesmente despenca o gráfico. Eu sei que não uso nada em contexto de aplicação, somente em sessão. É um tiro no escuro mas por isso que suspeito que o display-tag possa estar prendendo alguma referência no escopo de aplicação e não sessão.

Estou tentando usar o Tomcat em modo debug pra tentar achar onde isto está ficando preso. Se tiver alguma idéia por favor me diga. Valeu T+

Criado 25 de agosto de 2006
Ultima resposta 28 de ago. de 2006
Respostas 4
Participantes 2