Como obter dados confiáveis sobre o Java Heap Dumps?

8

Minha equipe está com dificuldades ao tentar obter bons dumps de heap acionados por OutOfMemoryErrors. Por razões específicas, estamos atualmente pegando os dumps com o jmap chamado de um script bash em vez de usar o sinalizador HeapDumpOnOutOfMemoryError. Estamos usando uma JVM 1.6 de 64 bits com um tamanho de heap de cerca de 3 GB. Nossos heap dumps falham 90% do tempo (guesstimate).

Existe algo que possamos fazer para melhorar nossas chances de obter um despejo de heap limpo que possamos usar para solucionar problemas de memória? Eu li que o jmap tinha problemas importantes no Java 1.4, mas que esses problemas devem ser abordados principalmente agora.

    
por karlcyr 06.02.2010 / 05:42

5 respostas

6

Qual é o seu sistema operacional? (Não posso adicionar comentários).

Para o Solaris, obtemos melhores resultados primeiro, forçando um dump principal ( gcore <pid> ) e, em seguida, anexando jmap ao arquivo de dump principal ( jmap -heap:format=b <path to java bin> <path to core> )

gcore é um utilitário * nix para gerar uma imagem de um programa em execução. Veja link .

    
por 23.03.2010 / 18:37
2

temos um JSP que consulta o ManagementFactory.getThreadMXBean () e produz um relatório. Pode não ser útil quando o aplicativo falhou, mas se você pesquisar a cada minuto, terá uma ideia do que está acontecendo.

Mais informações aqui

    
por 06.02.2010 / 09:41
2

você pode monitorar seu aplicativo via jmx do lado de fora. Quando você conhece algumas métricas que indicam um futuro OutOfMemory, você pode acionar um jmap antes que a exceção seja lançada.

    
por 06.02.2010 / 15:43
2

Obrigado a todos por suas sugestões.

O que acabamos fazendo é escrever um script para monitorar ativamente os logs da coleta de lixo. Em nossa experiência, os GC's consecutivos quase sempre precedem um OOM, portanto, nosso script detecta esse evento, remove o servidor do pool de balanceamento de carga e força o despejo do heap. Isso aumentou muito nossa eficácia.

    
por 07.04.2010 / 19:38
2

Esta é uma pergunta bastante antiga, mas vou responder com a esperança de que alguém possa achar isso útil.

O jmap tem uma opção -F (força). Isso provou não funcionar tão bem no passado para mim. Se você for usar a opção -F, recomendo que também especifique o diretório java.io.tmp como parte do comando jmap. Houve um problema com a versão 1.6.22 da JVM, em que o utilitário jmap não funcionou corretamente devido a uma configuração de diretório temporário.

Você também pode tentar obter um dump principal por meio do gdb. Depois de ter o núcleo, o jmap pode converter o núcleo em um dump de heap.

    
por 19.10.2012 / 02:59