Usando o parâmetro HeapDumpOnOutOfMemoryError para despejo de heap para JBoss

182

Foi-me dito que posso adicionar o -XX:+HeapDumpOnOutOfMemoryErrorparâmetro às minhas opções de inicialização da JVM no script de inicialização do JBoss para obter um dump de heap quando recebermos um erro de falta de memória em nosso aplicativo. Eu queria saber onde esses dados são despejados? É apenas para o console ou para algum arquivo de log? Se for apenas para o console, e se eu não estiver conectado ao servidor Unix através do console?

Dmitry Trunov
fonte
1
Essa é a pasta atual, eu acho.
Valentin Tihomirov

Respostas:

246

Aqui está o que a documentação da Oracle tem a dizer:

Por padrão, o dump de heap é criado em um arquivo chamado java_ pid .hprof no diretório de trabalho da VM, como no exemplo acima. Você pode especificar um nome de arquivo ou diretório alternativo com a -XX:HeapDumpPath=opção Por exemplo, -XX:HeapDumpPath=/disk2/dumps fará com que o despejo de heap seja gerado no /disk2/dumps diretório

Matt Solnit
fonte
16
Isso também lista todas as opções relacionadas ao desempenho da VM: java.sun.com/javase/technologies/hotspot/…
Ravi Gupta
4
Importante! Os sinalizadores HeapDump estão disponíveis apenas no Java 1.5.0_07.
Rustyx 17/09/12
14
Também é importante reconhecer que a JVM NÃO substituirá um dump de heap existente na HeapDumpPath, você verá algo semelhante ao "Unable to create /tmp/java_pidpid.hprof: File exists"da saída padrão. Certifique-se de mover seu arquivo de despejo para fora do caminho de despejo para abrir caminho para qualquer arquivo de despejo futuro; e use o <pid>espaço reservado no nome do arquivo para aumentar a entropia no nome do arquivo.
Ben
1
Foi extremamente útil. Levou apenas alguns minutos para encontrar o vazamento com o Eclipse Memory Analyzer.
Aron Lorincz
O que acontece se dermos um caminho para a pasta que não existe no sistema? Ele criará uma pasta e enviará o hump dump dentro dessa pasta?
Vinit89
47

Você pode visualizar este despejo no console UNIX.

O caminho para o dump de heap será fornecido como uma variável logo após o local em que você colocou a variável mencionada.

Por exemplo:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DOMAIN_HOME}/logs/mps"

Você pode visualizar o despejo no console no caminho mencionado.

Swaminathan Krishnamoorthi
fonte
4

Achei difícil decifrar o que se entende por "diretório de trabalho da VM". No meu exemplo, eu estava usando o programa Java Service Wrapper para executar um jar - os arquivos de despejo foram criados no diretório em que eu havia colocado o programa wrapper, por exemplo, c: \ myapp \ bin. A razão pela qual descobri isso é porque os arquivos podem ser muito grandes e eles encheram o disco rígido antes que eu descobrisse sua localização.

B5A7
fonte
Seu diretório de trabalho pode ser encontrado através do comando pwdx <PID>. Primeiro faça um ps -ef | grep java, encontre seu PID para seu aplicativo java e execute pwdx <PID>. Ele lhe dirá o diretório de trabalho.
RCG
2

Se você não estiver usando a opção "-XX: HeapDumpPath", no caso do JBoss EAP / As, por padrão, o arquivo de despejo de pilha será gerado no diretório "JBOSS_HOME / bin".

Swapnil Chaudhari
fonte