Como descobrir o que está consumindo a RAM?

18 respostas
F

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.

18 Respostas

T

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.

C

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…

F

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.

T

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

F

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

Vou dar uma estudada nele aqui.
Vlw.

V

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

L

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

V

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

L

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

V

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:

L

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!

F

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.

F

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

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.

L

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.

F

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.

F

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.

V

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.

Criado 26 de julho de 2010
Ultima resposta 28 de jul. de 2010
Respostas 18
Participantes 6