Como descobrir o que está consumindo a RAM?

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 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.

Vlw.

Procure pelo visualvm.
Vem junto da jdk 1.6, se não me engano fica no [JAVA_HOME]/lib/visualvm

[quote=Tchello] Procure pelo visualvm.
Vem junto da jdk 1.6, se não me engano fica no [JAVA_HOME]/lib/visualvm[/quote]

Vou dar uma estudada nele aqui.
Vlw.

Use mesmo o visual vm: https://visualvm.dev.java.net/

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/)

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. :slight_smile:

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

Exemplo:
java -jar SeuJar.jar -XX:+HeapDumpOnOutOfMemoryError

Mais informações: http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/clopts.html#gbzrr

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. :slight_smile:

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!

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.

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.

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.

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.

[quote=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.[/quote]

Vou tentar aqui. Quando consegui falo sobre o resultado.

[quote=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.[/quote]

Muito legal esse MAT.
Gerei o Dump pelo VisualVM e abri pelo MAT. Muito bom mesmo.
Vlw pela dica.

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.