kill -3 per ottenere il dump del thread java


116

Sto usando il kill -3comando per vedere il dump del thread della JVM in unix. Ma dove posso trovare l'output di questo killcomando? Mi sono perso!!


Quale processo stai uccidendo? È un app server J2EE? In questo caso dovresti trovare la traccia dello stack nello standard out.
Luciano Fiandesio

Sto uccidendo un processo che esegue la classe java
javanerd

2
Questo non dovrebbe scrivere il dump del thread sulla console. poiché la classe Java ha la console come uscita
standard

Risposte:


194

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

1
Sì, nel momento in cui viene eseguito. Puoi anche specificare -l (L minuscola) per un lungo elenco che stampa ulteriori informazioni sul lucchetto
Joshua McKinnon

2
Fino a quando il comando jstack fallisce costantemente a causa di "Impossibile dedurre il tipo di thread dall'indirizzo"
;-(

1
Se vedi quell'errore, ti suggerisco di parlarne con il tuo venditore. Una rapida ricerca mostra, ad esempio, che c'è un bug aperto in RHEL per quanto riguarda questo errore e openjdk ...
Joshua McKinnon

7
Vale la pena notare che jstack richiede JDK. Se stai eseguendo app su un server su cui è installato solo JRE, dovrai trovare un altro mezzo per il dumping dei thread.
jeffkempf

1
Ecco come utilizzare jstack per ottenere il dump del thread di un processo in esecuzione con un utente diverso, come il servizio Windows: stackoverflow.com/questions/1197912/…
Vadzim

44

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.


1
C'è un modo per reindirizzare l'output del dump del thread JVM su un file separato. Vedi nella mia risposta.
Vadzim

32

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

5
Tecnicamente questo non "reindirizza" l'output del dump del thread. Attiva la registrazione JVM in jvm.log (che include l'output del dump del thread) ma kill -QUIT continuerà a eseguire il dump allo stdout del processo (anche). Votato per la descrizione di oscure opzioni JVM :)
sqweek

25

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.


1
Sfortunatamente jcmdnon riesce a connettersi al processo del servizio Windows con com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attachwhile jstack -F: stackoverflow.com/questions/1197912/…
Vadzim

1
È necessario eseguire jcmd <pid> Thread.dump con lo stesso utente del processo java, altrimenti le connessioni verranno interrotte. Vedi stackoverflow.com/questions/25438983/…
Twilite

11

Nella stessa posizione in cui è posizionato lo stdout della JVM. Se hai un server Tomcat, questo sarà il catalina_(date).outfile.


8

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.
  • Se si ha accesso alla finestra della console in cui è in esecuzione il server, è possibile utilizzare Ctrl+ Breakcombinazione di tasti per generare la traccia dello stack su STDOUT.
  • Per le VM hotspot possiamo anche usare il jstackcomando 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]

Ho problemi con Kill -3 <PID>. Funziona bene ma interrompe il processo anche dopo aver scritto il dump del thread sulla console. Dovrebbe farlo?
Ashley

@ Ashley - no kill -3 <PID>, non dovrebbe uccidere la JVM. Che tipo di app Java stai guardando?
slm

2

In Jboss puoi eseguire quanto segue

nohup $JBOSS_HOME/bin/run.sh -c  yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out  2>&1 < /dev/null &
kill -3 <java_pid>

Questo reindirizzerà il tuo output / threadump alla console di file specificata nel comando precedente.



2

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.