Você está confundindo dois despejos java diferentes. kill -3
gera um despejo de encadeamento, não um despejo de heap.
Despejo de encadeamento = rastreia de pilha para cada encadeamento na saída da JVM para stdout como texto.
Despejo de heap = conteúdo da memória para a saída do processo da JVM em um arquivo binário.
Para executar um despejo de encadeamento no Windows, CTRL+ BREAKse sua JVM for o processo em primeiro plano, é a maneira mais simples. Se você possui um shell do tipo unix no Windows, como Cygwin ou MobaXterm, pode usarkill -3 {pid}
lo como no Unix.
Para fazer um despejo de encadeamento no Unix, CTRL+ Cse sua JVM for o processo em primeiro plano oukill -3 {pid}
funcionará desde que você obtenha o PID correto para a JVM.
Em qualquer plataforma, o Java vem com vários utilitários que podem ajudar. Para despejos de linha, jstack {pid}
é sua melhor aposta. http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html
Apenas para finalizar a pergunta de despejo: despejos de pilha não são comumente usados porque são difíceis de interpretar. Mas, eles têm muitas informações úteis, se você souber onde / como olhar para eles. O uso mais comum é localizar vazamentos de memória. É uma boa prática definir -D
na linha de comando java para que o dump do heap seja gerado automaticamente em um OutOfMemoryError. -XX:+HeapDumpOnOutOfMemoryError
Porém, você também pode acionar manualmente um dump do heap. A maneira mais comum é usar o utilitário java jmap
.
NOTA: este utilitário não está disponível em todas as plataformas. A partir do JDK 1.6,jmap
está disponível no Windows.
Um exemplo de linha de comando seria algo como
jmap -dump:file=myheap.bin {pid of the JVM}
A saída "myheap.bin" não é legível por humanos (para a maioria de nós) e você precisará de uma ferramenta para analisá-la. Minha preferência é MAT. http://www.eclipse.org/mat/