OutOfMemoryError: Java heap space

olá pessoal,
tenho uma aplicação web (a primeira) onde estou usando VRaptor.
acessando a aplicação, depois de algumas chamadas às lógicas, requisições, percebo q as respostas começam a ficar mais lentas e logo recebo esta exception, simplesmente pára de funcionar. :cry:
estou usando um amd turion 64 com 2GB RAM, não é problema na máquina.

podem me dar dicas para eu detectar esse problema por favor.

valeu

Realmente eh um problema grave de memória… 2GB e lotou tudo?? caralho…

uma dica, tente chamar o garbage colector System.cg()

ou então use um profiler pra detectar qual parte do seu código está consumindo tanta memoria assim…
eu uso o NetBeans com o plugin de Profiler, ambos vc encontra na página do NB

talvez isso ajude se for usar o profiler do NB.

http://www.netbeans.org/kb/55/profiler-tutorial.html#Exercise_3

Você está fechando suas conexões com o banco de dados (statements, result sets, etc)?

Evite utilizar System.gc().
Procure ver se os objetos que instâncias, logo que não use mais, tu os fecha. Conexões ao banco de dados, arquivos que abres etc, consomem uma memória razoável.

Até!

então, eu estou usando o hibernate para mapear no postgresql… funciona assim eu faço o login direto com o usuário do banco e utilizo ele em toda seção do usuário, então creio q a sessão do hibernate fique aberta.

o q posso fazer então?

Você setou o heap da sua JVM ou deixou o default? O default é 64MBytes.
Mas independente disto, o ideal é fazer o que o pessoal indicou:

  • Verificar no código possiveis problemas de “não desalocação” de memória (conexões, statements, etc).
  • Usar um profiler para detectar onde há maior consumo de memória.

[quote=maquiavelbona]Evite utilizar System.gc().
[/quote]

hehehe acho q comi bolinha no GC… tbm nunca uso… sempre q tenho problema de memoria recorro ao profiler pra ver onde tah dando erro… :lol:

blza, vou tentar usar, onde consigo informações d como usar o profiler?

eu nem sei o q eh! :oops:

vc está usando alguma IDE? se sim tente um plugin de profiler, geralmente vc encontra no site da IDE…

ai pra cima eu postei um link com um tutorial para usar o profiler do netbeans

hmmmmmmm, ok… eu uso o Eclipse IDE

deve ter no site do eclipse, procura lah…

Voce nao pode chamar o Garbage Collector explicitamente, se voce ta fazendo isso … ta fazendo algo errado com certeza.

la vao os passos,

:arrow:tunnar a JVM pois vc pode nao estar usando a memoria que voce acha que tem :slight_smile:

:arrow:vasculhar seu codigo atras de problemas, geralmente o problema esta aqui.

:arrow:contratar um consultor :wink:

ok, valeu galera, ao menos agora tenho uma direção prá tentar resolver o problema.

[]´s

seguinte pessoal, eu alterei os parâmetros da JVM no eclipse e funcionou, mas eu não sei até quando!
porém vou verificar com o profiler, pois acho q deve ter algum problema aí…

 Opa!
 Não sei se é o caso de você, mas reparei que no linux as vezes o Tomcat deixa uns processos [b]"zumbis"[/b] ocupando a memória quando você pára ou reinicia o tomcat. 
 Geralmente dá este erro aqui em um servidor com mais de um tomcat instalado (servidor de testes), depois que uma das aplicações fica no ar durante alguns dias ou é reiniciado muitas vezes. 

 Engraçado é que só acontece com o Tomcat 5.5, com o tomcat 4.0 acho que nunca vi este erro(as aplicações são as mesmas, porém  com código "migrado" para poder rodar). 
 Claro que não descarto problemas no próprio código da aplicação (apesar que já verificamos exaustivamente o código).
 Mesmo aumentando os paramêtros -[i]Xms[/i](start heap space) e -[i]Xmx[/i](maximum heap space) lá no [b]Catalina.sh[/b], as vezes ainda acontece.
Então eu geralmente mato os processos "java" sempre que reinicio o tomcat, aí funciona. Mas isso no meu caso, não sei se vai ajudar.

Em todos os casos, verificar o código usando um profiler deve ser sempre a primeira opção, pelo que andei lendo no fórum.
Abraço!

pessoal, acho q achei onde está o problema.

é que eu tinha um “interceptador” que respondia em todas as chamadas para as lógicas, e nele sempre dava um new DaoFactory().

muito bem, quase certeza que seja isso, resolvo colocando o new DaoFactory() apenas no login do usuário.

porém com essa alteração, fiquei com outro problema quando tento atualizar um registro:

a different object with the same identifier value was already associated with the session: [br.edu.unijales.sga.modelo.Cidade#2]

como resolvo este novo problema?

obrigado