Alternativas para criação de heap com alto desempenho do que jmap?

5

Eu tenho que criar o heapdumps, que funciona bem com o jmap. Meu problema é que o jmap leva muito tempo para criar o arquivo heapdump. Especialmente quando o heap está ficando maior (> 1GB), está demorando muito.

Uma situação como exemplo:
Quando o servidor tem problemas com o heapspace, quero reiniciá-lo automaticamente e criar um dump de pilha antes da reinicialização. Isso funciona, mas demora muito para gravar o heapumpump. Desta forma, o servidor está inativo por muito tempo. A criação do heapdump leva mais de uma hora.

Eu sei sobre -XX:+HeapDumpOnOutOfMemoryError , mas na maioria das vezes eu posso encontrar o problema de memória antes que a exceção seja lançada pelo 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 sistemas, mas acho que estou no lugar certo aqui.

    
por Christian 18.01.2010 / 13:54

1 resposta

8

Eu encontrei uma resposta para a minha pergunta. esta resposta a uma outra pergunta no serverfault deu-me a ideia.

  1. conecte-se com o gdb ao seu processo java
    gdb --pid=<your java pid>
  2. cria um dump principal do gdb
    gcore <file name>
    detach
    quit
  3. reinicie o processo java ou faça o que você quiser
  4. 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'.
    
por 25.03.2010 / 16:13