Eu encontrei uma resposta para a minha pergunta. esta resposta a uma outra pergunta no serverfault deu-me a ideia.
- conecte-se com o gdb ao seu processo java
gdb --pid=<your java pid>
- cria um dump principal do gdb
gcore <file name>
detach
quit - reinicie o processo java ou faça o que você quiser
- crie um dump de heap a partir do dump principal, conectando o jmap ao dump de núcleo e
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á anexar ao dump principal. se você não tiver certeza de qual binário foi usado para o processo java, abra o dump principal 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 heap dump 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 dump principal com gdb:
gdb --core=[path tp core file]
haverá uma linha como essa, informando o binário correto:
Core was generated by '/opt/tomcat/bin/jsvc'.