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.