
Eu tenho que criar heapdumps, o que funciona bem com o jmap. Meu problema é que o jmap demora muito para criar o arquivo heapdump. Especialmente quando o heap está ficando maior (> 1 GB), está demorando muito.
Uma situação como exemplo:
quando o servidor tem problemas com o heapspace, quero reiniciá-lo automaticamente e criar um heapdump antes de reiniciar. Isso funciona, mas demora muito para escrever o heapdump. Dessa forma, o servidor fica inativo por muito tempo. A criação do heapdump leva mais de uma hora.
Eu sei -XX:+HeapDumpOnOutOfMemoryError
, mas na maioria das vezes consigo encontrar o problema de memória antes que a exceção seja lançada pela jvm.
Existe uma alternativa ao jmap que grava os heapdumps mais rapidamente?
Uma solução especial para o exemplo acima também seria apreciada.
Esta questão é uma mistura entre programação e administração de sistema, mas acho que estou no lugar certo aqui.
Responder1
encontrei uma resposta para minha pergunta. essea resposta a uma outra pergunta sobre serverfault me deu a ideia.
- conecte-se com gdb ao seu processo java
gdb --pid=<your java pid>
- criar core dump do gdb
gcore <file name>
detach
quit - reinicie o processo java ou faça o que quiser
- crie um heap dump a partir do core dump, conectando jmap ao core dump
jmap -heap:format=b <path to java binary> <core dump file>
Na etapa 4, é vital que você especifique o binário java correto, caso contrário, o jmap não poderá ser anexado ao core dump. se você não tiver certeza de qual binário foi usado para o processo java, abra o core dump com gdb:
gdb --core=<core dump file>
Haverá uma linha como esta, informando o caminho completo:
Core was generated by '/opt/tomcat/bin/jsvc'.
criar o core dump é muito mais rápido do que criar o heapdump diretamente via jmap. dessa forma, você pode criar um heapdump de um processo Java sem tempos de inatividade muito longos.
EDIT:
quando você receber a seguinte mensagem de erro, pode ser que você tenha especificado o binário Java errado:
Error attaching to core file: Can't attach to the core file
para obter o binário java correto para a chamada jmap, abra o core dump com gdb:
gdb --core=[path tp core file]
haverá uma linha como esta, informando o binário correto:
Core was generated by `/opt/tomcat/bin/jsvc'.