meu aplicativo java continua em execução enquanto o jmap está recebendo seu despejo de memory?
obrigado
Seu aplicativo está parado. A única maneira prática de obter um dump de heap preciso seria parar toda a atividade do aplicativo enquanto o dump está sendo criado.
Se esta é uma pausa “breve” ou uma pausa “longa” depende de quanto é despejado. Se você usar “-dump”, você irá despejar o heap inteiro, incluindo objects inacessíveis. Se você usar “-dump: live” você só irá despejar objects alcançáveis … mas isso também implica (pelo menos) marcar o heap para descobrir quais objects são alcançáveis.
Mas se você estiver despejando um heap de gigabyte, espere que o tempo de pausa seja medido em segundos ou minutos, em vez de milissegundos.
Por causa da sugestão de que você poderia evitar a parada da JVM usando o fork, acontece que a bifurcação de um processo multi-threaded pode ser problemática:
Depois, há o problema de uso de resources.
Eu tive um problema com a tentativa de fazer isso em uma máquina de produção, criando o arquivo hprof com jmap levou idades e, naturalmente, trancado a webapp java para idades.
Eu encontrei esta página:
http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/
Que explicou que você também pode usar o gdb (em sistemas linux) para despejar o núcleo do processo java.
Com esse arquivo principal, é possível gerar o arquivo hprof para análise em um processo separado, que impede que o processo do servidor Java seja interrompido por um período tão longo. Qual é o que aconteceria se você fosse executar a mesma operação com o jmap.
Para resumir:
baixar e instalar o gdb
atualização do apt-get
apt-get install gdb
…
obter o id do processo java do processo java em que você está interessado
jps …
iniciar uma session do gdb com esse processo
gdb [pid] …
em seguida, gere o arquivo principal:
gcore /tmp/jvm.core
terminar a session do gdb
desappend sair
Em seguida, use o arquivo principal gerado para criar um arquivo hprof:
sudo jmap -dump: formato = b, arquivo = jvm.hprof / usr / bin / java /tmp/jvm.core
então (g) feche o arquivo e copie-o para a sua máquina para análise posterior.
Eu diria que o seu programa fará uma breve pausa enquanto o despejo de memory é feito. O despejo de memory é um instantâneo no tempo do seu programa em execução, portanto, o jmap precisará bloquear a JVM brevemente enquanto a memory é lida. Para enviar o arquivo de despejo de volta para o cliente, no entanto, poderia ser feito em um thread separado, minimizando assim a pausa.