a JVM está parada durante a execução do jmap?

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.