2015-03-09 14 views
7

È possibile recuperare l'ora di inizio di un determinato thread Java all'interno della JVM?Ora di inizio thread Java

Ho un dump di thread e sto guardando alcuni thread problematici che vorrei correlare a operazioni specifiche nel registro dell'applicazione utilizzando il tempo.

risposta

1

Sì, è possibile eseguire Oracle JDK/OpenJDK su Linux.

L'idea è di trovare ID thread nativo (TID) e quindi esaminare il tempo di modifica dello pseudo file /proc/JAVA_PID/task/TID.

Se si dispone di un dump di thread, questo è banale: l'id del thread nativo verrà stampato dall'intestazione del thread.

Per esempio, processo Java PID è 2086. È tipo

$ jstack 2086 

e ottenere una traccia dello stack con il seguente filo di interesse:

"Thread-26" prio=10 tid=0x00007f96c80c2800 nid=0x86a waiting on condition [0x00007f96c0ff2000] 
    java.lang.Thread.State: TIMED_WAITING (sleeping) 

Dove nid=0x86a è l'ID thread nativo. 0x86a = 2154, in modo che desideri esplorare compito 2154 del processo 2086:

$ ls -ld /proc/2086/task/2154 
dr-xr-xr-x 6 user user 0 Mar 10 23:12 /proc/2086/task/2154 
         ^^^^^^^^^^^^ 
         the thread start time 
+0

Grazie per l'input. Comunque non sto capendo la spiegazione. Ho una discarica di thread. Esiste un file pseude TID per ogni thread? Se potessi fornire un esempio, sarebbe fantastico. –

+0

@bobdabelina Ho aggiornato la risposta con un esempio. – apangin

+0

Grazie mille. Questo è molto utile. –

4

Non c'è alcun metodo nell'API Java che fornisce queste informazioni. Inoltre, potrebbe non essere comunque utile. Considerare il caso di un pool di thread in cui la creazione del thread non è necessariamente legata agli eventi a livello di applicazione.

Se si ha il pieno controllo della creazione del thread, è possibile allegare una variabile locale del thread al thread che ne registra il tempo di creazione.

+0

Grazie per la risposta. Credo che questi thread vengano invocati dalle richieste degli utenti. Sfortunatamente non ho la possibilità di modificare il codice in questo momento e devo lavorare con quello che è attualmente in esecuzione sulla produzione. –

+0

Vengono creati da un contenitore (ad esempio un server di app) o il codice dell'applicazione li sta creando? – amahfouz

+0

Vengono creati dal contenitore. –

0

provare a utilizzare "ps -p $ pid -wLo lwp, lstart"