Come menzionato da ckhan, jstack
è ottimo perché fornisce la traccia completa dello stack di tutti i thread attivi nella JVM. Lo stesso può essere ottenuto sullo stderr della JVM usando SIGQUIT.
Un altro strumento utile è jmap
che può acquisire un dump dell'heap dal processo JVM utilizzando il PID del processo:
jmap -dump:file=/tmp/heap.hprof $PID
Questo heap dump può essere caricato in strumenti come visualvm
(che ora fa parte dell'installazione standard di Oracle java sdk, denominata jvisualvm). Inoltre, VisualVM può connettersi alla JVM in esecuzione e visualizzare informazioni sulla JVM, inclusi i grafici sull'utilizzo della CPU interna, i conteggi dei thread e l'utilizzo dell'heap, ottimo per rintracciare le perdite.
Un altro strumento, jstat
, può raccogliere statistiche sulla garbage collection per la JVM per un periodo di tempo molto simile a vmstat quando viene eseguito con un argomento numerico (ad es. vmstat 3
).
Infine, è possibile utilizzare un agente Java per eseguire il push della strumentazione su tutti i metodi di tutti gli oggetti al momento del caricamento. La libreria javassist
può aiutare a rendere questo molto facile da fare. Quindi, è possibile aggiungere la propria traccia. La parte difficile sarebbe trovare un modo per ottenere l'output di traccia solo quando lo desideri e non tutto il tempo, il che probabilmente rallenterebbe la JVM a una scansione. C'è un programma chiamato dtrace
che funziona in un modo come questo. L'ho provato, ma non ha avuto molto successo. Tieni presente che gli agenti non possono strumentare tutte le classi perché quelle necessarie per eseguire il bootstrap della JVM vengono caricate prima che l'agente possa strumentare, quindi è troppo tardi per aggiungere strumentazione a quelle classi.
Il mio suggerimento - inizia con VisualVM e vedi se questo ti dice quello che devi sapere poiché può mostrare i thread correnti e le statistiche importanti per la JVM.
Allo stesso modo, durante il debug di programmi che sono andati male su un sistema Linux, puoi utilizzare strumenti simili per eseguire il debug di JVM in esecuzione sul tuo sistema.
Strumento n. 1 - jvmtop
Simile a top
, puoi usare jvmtop per vedere quali sono le classi all'interno delle JVM in esecuzione sul tuo sistema. Una volta installato, lo invochi in questo modo:
$ jvmtop.sh
Il suo output ha uno stile simile per assomigliare allo strumento top
:
JvmTop 0.8.0 alpha amd64 8 cpus, Linux 2.6.32-27, load avg 0.12
http://code.google.com/p/jvmtop
PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL
3370 rapperSimpleApp 165m 455m 109m 176m 0.12% 0.00% S6U37 web 21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager 11m 28m 23m 130m 0.00% 0.00% S6U37 web 31
19187 m.jvmtop.JvmTop 20m 3544m 13m 130m 0.93% 0.47% S6U37 web 20
16733 artup.Bootstrap 159m 455m 166m 304m 0.12% 0.00% S6U37 web 46
Strumento n. 2 - jvmonitor
Un'altra alternativa è usare jvmmonitor. JVM Monitor è un profiler Java integrato con Eclipse per monitorare CPU, thread e utilizzo della memoria delle applicazioni Java. Puoi usarlo per trovare automaticamente JVM in esecuzione sull'host locale oppure puoi connetterti a JVM remote usando un [email protected]
Strumento n. 3 - visualvm
visualvm è probabilmente "lo strumento" da raggiungere durante il debug dei problemi con la JVM. Il suo set di funzionalità è piuttosto ampio e puoi dare uno sguardo molto approfondito all'interno.
Profilare le prestazioni dell'applicazione o analizzare l'allocazione della memoria:
Prendi e visualizza i thread dump:
Riferimenti
- tutorial visualvm
Considera jstack
.Non corrisponde esattamente a strace
, più di un pstack
-analog, ma ti darà almeno un'immagine di un'istantanea in tempo. Potrebbe metterli insieme per ottenere una traccia grossolana se fosse necessario.
Vedi anche i suggerimenti in questo articolo SO:https://stackoverflow.com/questions/1025681/call-trace-in-java