Bom pessoal, tenho uma aplicação, que recebe requisições de outras. Utilizo muito a API Collections, com threads e talz.
Noto que ao receber requisições, o consumo da RAM vai aumentando e nunca desce.
Tem algum modo ou alguma ferramenta para ajudar a analisar e apontar onde possa estar o problema, indicando qual o objeto está se matendo “eterno” na memória ?
Um ThreadDump serveria ?
O que você precisa é de um profiler.
Há vários disponíveis, inclusive um que vem, se não me engano, com o update 14 da jdk 1.6.
Nele você pode analisar onde está sendo consumido memória e processamento em tempo de execução, daí você pode identificar os leaks e analisa-los mais pontualmente, do que partir do zero.
[quote=fsfnit]Bom pessoal, tenho uma aplicação, que recebe requisições de outras. Utilizo muito a API Collections, com threads e talz.
Noto que ao receber requisições, o consumo da RAM vai aumentando e nunca desce.
Tem algum modo ou alguma ferramenta para ajudar a analisar e apontar onde possa estar o problema, indicando qual o objeto está se matendo “eterno” na memória ?
Um ThreadDump serveria ?
Valew.
[/quote]
O NetBeans tem um monitor de objetos muito bom, não me lembro direito o nome mas dê uma olhada que tem…
[quote=Carlos_ds_jar][quote=fsfnit]Bom pessoal, tenho uma aplicação, que recebe requisições de outras. Utilizo muito a API Collections, com threads e talz.
Noto que ao receber requisições, o consumo da RAM vai aumentando e nunca desce.
Tem algum modo ou alguma ferramenta para ajudar a analisar e apontar onde possa estar o problema, indicando qual o objeto está se matendo “eterno” na memória ?
Um ThreadDump serveria ?
Valew.
[/quote]
O NetBeans tem um monitor de objetos muito bom, não me lembro direito o nome mas dê uma olhada que tem…[/quote]
Pois é, com o netbeans era moleza, mas estou usando o eclipse, e só conheço esses profilers pagos.
Mas vou varrer a net aqui, qq coisa que eu achar e testar, posto aqui para a comunidade.
Se seu HEAP estiver muito grande e você não estiver conseguindo analisar com o profiler, tire um dump do heap com o jmap (vem junto com o JDK) e depois analise com o MAT (http://www.eclipse.org/mat/)
ViniGodoy, mas a opção -XX:+HeapDumpOnCtrlBreak também funciona se o processo estiver rodando em background e só for possível matar com kill (ambiente Linux)?
Não, isso só funciona com o console mesmo. Para esse caso, aí sim, você usa o JMap.
De qualquer forma, eu prefiro é deixar o parâmetro do dump on outofmemory. Isso pq a VM tira o dump no exato momento que o erro ocorre, antes de limpar toda memória. Não tem como ter dump mais preciso que esse.
Mas o JMap é util em situações mais específicas. Estava com um problema em que o heap chegava em um valor alto (próximo do máximo), mas não causava OutOfMemoryError. Nesse ponto, a aplicação ficava uma carroça, pois não parava de passar GC e não conseguia liberar memória. Ai o JMap me salvou!
Pois é galera, estava com problemas aqui e não consegui botar para rodar o visualVM.
Assim que botar para rodar falo para vocês se consegui atingir o objetivo que é descobrir o que está comendo a memória.
Agradeço desde já a todos os amigos que estão tentando me ajudar.
Abri o VisualVM, rodei a minha aplicação e fiz o profiler.
Ai o VisualVM me relatou que estou consumindo muita memória com objetos Strings, Char, e outras primitivas da API QuickFix.
Agora, como faço para saber onde a minha aplicação está consumindo tais objetos e primitivas para que eu possar saber onde atacar ?
Você precisa agora usar sua cabeça.
Você pode ir desativando módulos da sua aplicação, um de cada vez, até descobrir qual deles, quando funciona, consome mais memória.
O visual VM também permite que você abra as instâncias de determinado objeto. Ali, você pode fazer uma pequena amostragem, pois tipicamente elas pertencerão a objetos da mesma classe (a que tem o leak).
Mas eu sinto falta de relatórios da VisualVM que mostrem o consumo total de cada classe. Oi, nem que fosse o mesmo relatório, mas como nível mais baixo as classes que não são da sun.