Estou usando o kill -3
comando para ver o despejo de thread da JVM no Unix. Mas onde posso encontrar a saída desse kill
comando? Eu estou perdido!!
Estou usando o kill -3
comando para ver o despejo de thread da JVM no Unix. Mas onde posso encontrar a saída desse kill
comando? Eu estou perdido!!
Respostas:
Você também pode usar jstack (incluído com o JDK) para fazer um despejo de thread e gravar a saída onde quiser. Isso não está disponível em um ambiente unix?
jstack PID > outfile
O despejo de thread é gravado no sistema fora da VM na qual você executou o kill -3
. Se você estiver redirecionando a saída do console da JVM para um arquivo, o dump do encadeamento estará nesse arquivo. Se a JVM estiver sendo executada em um console aberto, o dump do encadeamento será exibido em seu console.
Há uma maneira de redirecionar a saída de despejo de thread da JVM no sinal de interrupção para separar o arquivo com a opção de diagnóstico LogVMOutput :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
Com o Java 8 em cena, jcmd
é a abordagem preferida.
jcmd <PID> Thread.print
A seguir está o snippet da documentação da Oracle :
O lançamento do JDK 8 introduziu o Java Mission Control, o Java Flight Recorder e o utilitário jcmd para diagnosticar problemas com aplicativos JVM e Java. É sugerido usar o utilitário mais recente, jcmd em vez do utilitário jstack anterior para diagnósticos aprimorados e sobrecarga de desempenho reduzida.
No entanto, enviar isso com o aplicativo pode ser implicações de licenciamento que eu não tenho certeza.
jcmd
não se conecta ao processo de serviço Windows com com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
enquanto jstack -F
sucede: stackoverflow.com/questions/1197912/...
Ao usar kill -3, deve-se ver o despejo do thread na saída padrão. A maioria dos servidores de aplicativos grava a saída padrão em um arquivo separado. Você deve encontrá-lo lá ao usar kill -3. Existem várias maneiras de obter despejos de thread:
kill -3 <PID>
: Dá saída para saída padrão.Para VMs de hotspot, também podemos usar o jstack
comando para gerar um despejo de thread. Faz parte do JDK. A sintaxe é a seguinte:
Usage:
jstack [-l] <pid> (to connect to running process)
jstack -F [-m] [-l] <pid>(to connect to a hung process)
- For JRockit JVM we can use JRCMD command which comes with JDK Syntax:
jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]
kill -3 <PID>
, não deve matar o JVM. Que tipo de aplicativo Java você está procurando?
Etapas que você deve seguir se quiser o despejo de thread de seu processo Java autônomo
Etapa 1: obtenha o ID do processo para o script de shell que chama o programa java
linux$ ps -aef | grep "runABCD"
user1 **8535** 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17796 17372 0 08:15:41 pts/49 0:00 grep runABCD
Etapa 2: Obtenha a ID do processo para o filho que foi invocado pelo runABCD. Use o PID acima para obter os filhos.
linux$ ps -aef | grep **8535**
user1 **8536** 8535 0 Mar 25 ? 126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer
user1 8535 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17977 17372 0 08:15:49 pts/49 0:00 grep 8535
Etapa 3: obtenha o JSTACK para o processo específico. Obtenha a identificação do processo do seu processo XYSServer. ie 8536
linux$ jstack **8536** > threadDump.log