Sto usando il kill -3
comando per vedere il dump del thread della JVM in unix. Ma dove posso trovare l'output di questo kill
comando? Mi sono perso!!
Sto usando il kill -3
comando per vedere il dump del thread della JVM in unix. Ma dove posso trovare l'output di questo kill
comando? Mi sono perso!!
Risposte:
In alternativa, puoi usare jstack (incluso con JDK) per eseguire un dump del thread e scrivere l'output dove vuoi. Non è disponibile in un ambiente unix?
jstack PID > outfile
Il dump del thread viene scritto nel sistema dalla VM su cui è stato eseguito il file kill -3
. Se stai reindirizzando l'output della console della JVM a un file, il dump del thread sarà in quel file. Se la JVM è in esecuzione in una console aperta, il dump del thread verrà visualizzato nella sua console.
C'è un modo per reindirizzare l'output del dump del thread JVM al segnale di interruzione in un file separato con l'opzione diagnostica LogVMOutput :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
Con Java 8 nell'immagine, jcmd
è l'approccio preferito.
jcmd <PID> Thread.print
Di seguito è riportato lo snippet dalla documentazione Oracle :
Il rilascio di JDK 8 ha introdotto Java Mission Control, Java Flight Recorder e l'utilità jcmd per la diagnosi dei problemi con le applicazioni JVM e Java. Si consiglia di utilizzare l'utilità più recente, jcmd invece della precedente utilità jstack per una diagnostica avanzata e un sovraccarico delle prestazioni ridotto.
Tuttavia, la spedizione di questo con l'applicazione potrebbe avere implicazioni sulla licenza di cui non sono sicuro.
jcmd
non riesce a connettersi al processo del servizio Windows con com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
while jstack -F
: stackoverflow.com/questions/1197912/…
Quando si usa kill -3 si dovrebbe vedere il dump del thread nell'output standard. La maggior parte dei server delle applicazioni scrive l'output standard in un file separato. Dovresti trovarlo lì quando usi kill -3. Esistono diversi modi per ottenere i dump dei thread:
kill -3 <PID>
: Fornisce l'output allo standard output.Per le VM hotspot possiamo anche usare il jstack
comando per generare un dump del thread. Fa parte del JDK. La sintassi è la seguente:
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>
, non dovrebbe uccidere la JVM. Che tipo di app Java stai guardando?
Passaggi da seguire se si desidera il dump del thread del processo Java autonomo
Passaggio 1: ottenere l'ID processo per lo script della shell che chiama il programma 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
Passaggio 2: ottenere l'ID processo per il figlio che è stato richiamato da runABCD. Usa il PID sopra per ottenere i figli.
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
Passaggio 3: ottieni il JSTACK per il particolare processo. Ottieni l'ID processo del tuo processo XYSServer. cioè 8536
linux$ jstack **8536** > threadDump.log