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.
Carlos_ds_jar
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.
O NetBeans tem um monitor de objetos muito bom, não me lembro direito o nome mas dê uma olhada que tem…
fsfnit
Carlos_ds_jar:
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.
O NetBeans tem um monitor de objetos muito bom, não me lembro direito o nome mas dê uma olhada que tem…
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.
Vlw.
Tchello
Procure pelo visualvm.
Vem junto da jdk 1.6, se não me engano fica no [JAVA_HOME]/lib/visualvm
fsfnit
Tchello:
Procure pelo visualvm.
Vem junto da jdk 1.6, se não me engano fica no [JAVA_HOME]/lib/visualvm
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
Você não precisa do JMap para gerar o heap dump. Basta adicionar o seguinte flag na linha de execução da VM:
-XX:+HeapDumpOnOutOfMemoryError
Deixe o erro ocorrer e o heap ficará gravado no mesmo diretório da sua aplicação.
Se precisar gerar um heap dump num momento específico, você pode usar também a flag:
-XX:+HeapDumpOnCtrlBreak
Aí, basta ir até o console do java e pressionar CTRL+Break para o heap ser gerado.
Se quiser especificar o caminho do heap dump, use a opção:
-XX:HeapDumpPath=file
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)?
ViniGodoy
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.
LucianoM86
haha, com certeza!
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!
fsfnit
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.
fsfnit
Bom pessoal,
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 ?
Obrigado.
E
entanglement
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.
LucianoM86
Ai que o MAT ajuda e muito!Ele mostra um relatório com as possíveis classes que estão consumindo a memória sem liberar.
Ps.: Não sei se o VisualVM também tem isso.
fsfnit
LucianoM86:
Ai que o MAT ajuda e muito!Ele mostra um relatório com as possíveis classes que estão consumindo a memória sem liberar.
Ps.: Não sei se o VisualVM também tem isso.
Vou tentar aqui. Quando consegui falo sobre o resultado.
fsfnit
LucianoM86:
Ai que o MAT ajuda e muito!Ele mostra um relatório com as possíveis classes que estão consumindo a memória sem liberar.
Ps.: Não sei se o VisualVM também tem isso.
Muito legal esse MAT.
Gerei o Dump pelo VisualVM e abri pelo MAT. Muito bom mesmo.
Vlw pela dica.
ViniGodoy
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.