Como descobrir o que está consumindo a RAM ?  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
fsfnit
Java Ninja
[Avatar]

Membro desde: 16/05/2006 13:38:27
Mensagens: 283
Localização: Far Far Away - Niterói / RJ
Offline

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.
Tchello
GUJ Master
[Avatar]

Membro desde: 07/06/2008 14:41:04
Mensagens: 1694
Offline

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
Virtual Machine Man
[Avatar]

Membro desde: 27/01/2007 15:38:24
Mensagens: 540
Localização: Ceará e Paraíba
Offline

fsfnit wrote: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...

"O Java é capaz de gerar mais soluções e mais problemas do que a nossa 'vã' filosofia é capaz de prever!"
[Email] [MSN]
fsfnit
Java Ninja
[Avatar]

Membro desde: 16/05/2006 13:38:27
Mensagens: 283
Localização: Far Far Away - Niterói / RJ
Offline

Carlos_ds_jar wrote:
fsfnit wrote: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
GUJ Master
[Avatar]

Membro desde: 07/06/2008 14:41:04
Mensagens: 1694
Offline

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

Membro desde: 16/05/2006 13:38:27
Mensagens: 283
Localização: Far Far Away - Niterói / RJ
Offline

Tchello wrote: 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.
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

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

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
LucianoM86
JavaChild
[Avatar]

Membro desde: 02/09/2006 19:27:37
Mensagens: 120
Localização: Campinas, SP
Offline

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

OCJP, OCWCD, OCBCD e OCMJEA
Twitter: LucMolinari
http://lucianomolinari.wordpress.com
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

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

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

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

This message was edited 1 time. Last update was at 26/07/2010 14:25:30


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
LucianoM86
JavaChild
[Avatar]

Membro desde: 02/09/2006 19:27:37
Mensagens: 120
Localização: Campinas, SP
Offline

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

This message was edited 1 time. Last update was at 26/07/2010 15:43:01


OCJP, OCWCD, OCBCD e OCMJEA
Twitter: LucMolinari
http://lucianomolinari.wordpress.com
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

LucianoM86 wrote: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.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
LucianoM86
JavaChild
[Avatar]

Membro desde: 02/09/2006 19:27:37
Mensagens: 120
Localização: Campinas, SP
Offline

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!

OCJP, OCWCD, OCBCD e OCMJEA
Twitter: LucMolinari
http://lucianomolinari.wordpress.com
fsfnit
Java Ninja
[Avatar]

Membro desde: 16/05/2006 13:38:27
Mensagens: 283
Localização: Far Far Away - Niterói / RJ
Offline

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
Java Ninja
[Avatar]

Membro desde: 16/05/2006 13:38:27
Mensagens: 283
Localização: Far Far Away - Niterói / RJ
Offline

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.
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

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.
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team