Consumo Excessivo de mem -Glassfish 3.2.1-Rodando App com Vraptor3.4.1+Titles2.2+Hibernate 4.1

Pessoal,

Estou desenvolvendo uma APP usando io Vraptor 3.4.1 o Tiles 2.2 e o Hibernate 4.1. Pois bem, fiz o deploy de minha app em uma máquina virtual com 2gb de memória, rodando o glassfish 3.2.1. Bem, só rodando a instância do glassfish com os monitores todos no high, ele já utiliza 580 de memória RAM, quando eu subo minha APP ele vai para uns 850 megas. Bem, uso somente fecth Lazy, uso singleton para armazenar os objetos, e na minha sessão só deixo poucos objetos necessários.

Alguém tem alguma dica que possa me dar?

Pode ser teu singleton que faz cache. Ele ñ está rodando coisa d+ não?

Outra coisa seria utilizar ferramentas para analisar a memória.

Bom, ele nem está guardando tanta coisa assim, ele guarda uma lista de objetos, mas todos esses estão com suas propriedades como Lazy(O que o hibernate vai guardar somente um proxy, não vai trazer os objetos carregados, cerot?). Bem, a utilização de memória agora está perto de 1 Giga, não sei como é o funcionamento do Garbage Collector do java, mas parece que ele só limpa memória quando precisa, correto? Estou a ficar preocupado com essa utilização de memória excessiva, no meu ambiente de desenvolvimento, eu tenho problemas de Perm Gem, isso porque cada vez que salvo alguma coisa, o netbeans faz novo deploy, já vi soluções paleativas de aumentar a memória do Heap, mas isso é apenas um paleativo … Meu medo é que isso reflita no ambiente de produção, só disponibilizaram 2 Gigas de memória em uma máquina virtual para nossa aplicação, se começar a usar perto do máximo, vai ser um problema …

Por que você não faz um teste de rodar alguma parte de código sem passar pelo cache.

Você poderia fazer testes do tipo:

  1. Se você der o start na aplicação sem acessar nada. Ela estoura memória?
  2. Se você acessar apenas a mesma tela diversas vezes, ela estoura a memória?
  3. Se você criar uma tela que não passe pelo cache, ela estoura a memória?

Pode ser memory leak do cache ou de alguma parte do projeto.

Vou começar a investigar isso, estou monitorando o uso de memória da APP, aparentemente ela não está apresentando um aumento da utilização de memória sem o uso da aplicação, com o uso da APP,o aumento de memória está estável, vou ficar de olho nesses quesitos durante essa semana.

Obrigado

Já entou usar um profiler?

Outra coisa, evite redeploys em ambiente de produção, pois as classes previamente carregadas pelo classloader vão continuar na memória. Aumentar a heap também não aumenta o permgen, são regiões de memória completamente diferentes.

Tunning de garbage collector é uma das últimas coisas que eu faço, geralmente o gargalo fica em algoritmos ineficientes e mau uso de frameworks (fazer cache de segundo nível de dados que mudam rapidamente, por exemplo).

Mais uma coisa: evite o singleton. Ele não escala, é difícil de testar, aumenta o acoplamento… já virou um anti-pattern.