GNU/Linux >> Linux Esercitazione >  >> Linux

Come rintracciare un programma Java?

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


Linux
  1. Come tracciare le operazioni IO per file in Linux?

  2. Come conoscere il percorso JVM in un sistema Linux?

  3. Come possiamo rintracciare i problemi di crash dei programmi in Linux?

  4. Come tracciare l'attività di rete di un comando?

  5. Come abilitare IPtables TRACE Target su Debian Squeeze (6)

Come costruire un Flatpak

Come tracciare l'esecuzione del programma utilizzando il comando Strace di Linux

Come cercare in Nano

Come installare OmniOS ce

Come tracciare e tracciare un processo Linux

Script Perl in esecuzione all'infinito:come eseguire il debug di ciò che è accaduto?