Come posso creare un dump del thread di un'applicazione Java Web Start
-
01-07-2019 - |
Domanda
È possibile ottenere un dump del thread di un'applicazione Java Web Start?E se sì, come?
Sarebbe bello se esistesse una soluzione semplice, che consentisse a un non sviluppatore (cliente) di creare un dump del thread.In alternativa, è possibile creare un dump del thread a livello di codice?
Nella console Java Web Start posso ottenere un elenco di thread premendo "t" ma gli stacktrace non sono inclusi.
Se le risposte richiedono determinate versioni Java, comunicalo.
Soluzione
Nella console, premi V anziché T:
t: dump thread list
v: dump thread stack
Funziona con JDK6.Non so degli altri.
In alternativa, sotto JDK5 (e possibilmente prima) puoi inviare una traccia dello stack completo di tutti i thread allo standard out:
Sotto Windows: digitare ctrl-break nella console Java.
Sotto Unix: kill -3 <java_process_id>
(per esempio.uccidi -3 5555).Questo NON ucciderà la tua app.
Un'altra cosa:Come altri dicono, puoi ottenere gli stack in modo programmatico tramite il file Thread
lezione ma attenzione Thread.getAllStackTraces()
prima di JDK6 perché c'è una perdita di memoria.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434648
Saluti,
scotty
Altri suggerimenti
I JDK recenti (purtroppo non i JRE) includono strumenti come jstack che fa queste cose.Le JVM della versione 5 includono estensioni JMX per ottenere dump dei thread, statistiche di memoria e molto altro.Tutte le applicazioni Java, comprese le applicazioni Web Start, dispongono di questa funzionalità.
Dovresti avere installato JDK o scrivere un client JMX che faccia la stessa cosa.Dare un'occhiata a http://java.sun.com/javase/6/docs/technotes/guides/management/ per ottenere maggiori informazioni.
Dalla 1.5 puoi usare Thread.getAllStackTraces()
prendere un Map
per ripetere.
L'output ideale sarebbe quello prodotto da Ctrl-\ (o Ctrl-Break o simili), ma non sembra esserci un modo documentato per produrlo.Se sei disposto a limitarti alla JVM del sole (o suppongo che usi la riflessione) potresti dare un'occhiata intorno sun.*
packages e vedere se viene fuori qualcosa di interessante.
Tentativo
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
Quindi puoi scorrere la raccolta per mostrare i primi x elementi dello stack che ti interessano.
A partire da Java 5 hai il metodo getStackTrace() della classe Thread.Per le versioni precedenti puoi fare:
Thread.currentThread().dumpStack();
Questo stamperà la traccia dello stack su System.out