Como analiso um arquivo .hprof?

227

Eu tenho um servidor de produção executando com o seguinte sinalizador: - XX: + HeapDumpOnOutOfMemoryError

Na noite passada, ele gerou um arquivo java-38942.hprof quando nosso servidor encontrou um erro de heap. Acontece que os desenvolvedores do sistema conheciam a bandeira, mas não tinham como obter informações úteis.

Alguma ideia?

Nick Stinemates
fonte

Respostas:

215

Se você deseja que uma ferramenta bastante avançada faça algumas cutucadas, consulte o projeto Memory Analyzer no Eclipse, contribuído pela SAP pela SAP.

Algumas das ações que você pode fazer são incrivelmente boas para encontrar vazamentos de memória, etc. - incluindo a execução de uma forma de SQL (OQL) limitado nos objetos da memória, ou seja,

SELECT toString (firstName) FROM com.yourcompany.somepackage.User

Totalmente brilhante.

Cowan
fonte
18
Gostaria apenas de adicionar um +100 para o Eclipse Memory Analyzer. Atualmente, estou tentando peneirar um arquivo de despejo de heap de 400mb + e demorou mais de 70 minutos para ler o arquivo, antes que causasse uma falha completa na JVM. A EMA pode abri-lo em menos de 5 minutos.
Matt b
3
Continuo recebendo erros de análise ao abrir arquivos HPROF usando o Eclipse Memory Analyzer (que também foram despejados pelo Eclipse!). Infeliz .. suspiro.
lost_bits1110
3
O MAT ainda pode exigir bastante RAM (menos que JHAT, mas ainda bastante). Consulte stackoverflow.com/questions/7254017/… para obter dicas, se você se deparar com isso.
Rogerdpack #
71

Você pode usar o JHAT , a Java Heap Analysis Tool fornecida por padrão com o JDK. É linha de comando, mas inicia um servidor / navegador da web que você usa para examinar a memória. Não é o mais fácil de usar, mas pelo menos já está instalado na maioria dos lugares por onde você vai. Uma visualização muito útil é o link "heap histograma" na parte inferior.

ex: jhat -port 7401 -J-Xmx4G dump.hprof

jhat também pode executar o OQL "atualmente" (link inferior "execute o OQL")

CMS
fonte
Após executar o comando acima, no console, você receberá a mensagem no terminal "o servidor está pronto" Porta: 7401. Depois disso, abra este URL: localhost: 7401 ", você poderá ver detalhes nas janelas do navegador".
Laxman G
35

Você também pode usar o HeapWalker no Netbeans Profiler ou na ferramenta autônoma do Visual VM . O Visual VM é uma boa alternativa ao JHAT, pois é independente, mas é muito mais fácil de usar que o JHAT.

Você precisa do Java 6+ para usar totalmente o Visual VM.

James Schek
fonte
Você deve adicionar uma nota de que isso é apenas para Java 6 e 7.
Nick Stinemates 9/10/08
O AFAIK, o HeapWalker e o VisualVM não precisam do Java 6/7 para ler arquivos HPROF.
James Schek 9/10/08
Eu apenas tentei carregá-lo com o Java 5 e ele disse 'Por favor, use o Java 6 ou 7' O que estou fazendo de errado?
Nick Stinemates
Hmm. Talvez você precise executar o Java 6, mas pode ler um Java 5 HPROF (talvez seja assim que eu consegui). Eu sei que você não pode criar um heap-dump a partir do Visual VM em um aplicativo executando o Java 5. Será atualizado.
James Schek 9/10/08
Você também pode usar JVM visual, a partir SDK java - olhar para jvisualvm.exea JAVASDK/binpasta
xxxvodnikxxx
11

Basta adquirir o Eclipse Memory Analyzer . Não há nada melhor lá fora e é grátis.

JHAT é utilizável apenas para "aplicações de brinquedos"

kohlerm
fonte
3
O JHAT é necessário para impressionar os hackers "l33t" que constroem manualmente uma distribuição BSD começando com o LILO. Espere ... eles nunca usariam java de qualquer maneira. :-)
James Schek 9/10/08
Eu acho que isso é mais um comentário ...: \
rogerdpack 28/11
10

O YourKit Java Profiler parece lidar com eles também.

Polaris
fonte
5

Se você quiser fazer uma análise personalizada do seu heapdump, então há:

Essa biblioteca é rápida, mas você precisará escrever seu código de análise em Java.

Dos documentos:

  • Não cria nenhum arquivo temporário no disco para processar o despejo de heap
  • Pode trabalhar diretamente com despejos de heap compactados GZ
  • Notação HeapPath
Andrejs
fonte
2

Pessoalmente, prefiro o VisualVM. Um dos recursos que eu gosto no VisualVM é a comparação de heap dump. Quando você está fazendo uma análise de despejo de heap, existem várias maneiras de descobrir o que causou a falha. Uma das maneiras que considero úteis é fazer uma comparação de lixões heap saudáveis ​​e não saudáveis.

A seguir estão as etapas que você pode seguir para isso:

  1. Obtendo um despejo de pilha do OutOfMemoryError, vamos chamá-lo de "oome.hprof". Você pode obter isso através do parâmetro JVM HeapDumpOnOutOfMemoryError.
  2. Reinicie o aplicativo e deixe-o funcionar por um grande (minutos / horas), dependendo do seu aplicativo. Obtenha outro despejo de pilha enquanto o aplicativo ainda estiver em execução. Vamos chamá-lo de "healthy.hprof".
  3. Você pode abrir esses dois despejos no VisualVM e fazer uma comparação de despejo de heap. Você pode fazer isso no nível de classe ou pacote. Isso geralmente pode indicar a direção do problema.

link: https://visualvm.github.io

Waleed
fonte