GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:come tracciare un programma Java?

In qualità di amministratore di sistema, a volte devo affrontare situazioni in cui un programma si comporta in modo anomalo, senza creare alcun errore o creare messaggi di errore senza senso.

In passato – prima che java entrasse – c'erano due contromisure:

  1. Se nient'altro aiuta – RTFM 😉
  2. Se anche 1. non aiuta, traccia le chiamate di sistema e guarda cosa sta succedendo

Di solito uso strace -f per questa attività con Linux (altri sistemi operativi hanno strumenti di traccia simili). Ora, mentre questo di solito funziona bene per qualsiasi programma vecchio stile, la traccia diventa molto sfocata quando si fa lo stesso su un java -processi. Ci sono così tante chiamate di sistema apparentemente estranee a qualsiasi azione reale, che è terribile cercare in un tale dump.

Ci sono modi migliori per farlo (se il codice sorgente non è disponibile)?

Risposta accettata:

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 su stderr della JVM utilizzando 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 dump dell'heap 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 dell'utilizzo interno della CPU, il conteggio dei thread e l'utilizzo dell'heap, ottimo per rintracciare le perdite.

Un altro strumento, jstat , può raccogliere statistiche di Garbage Collection per la JVM in un periodo di tempo molto simile a vmstat quando viene eseguito con un argomento numerico (ad es. vmstat 3 ).

Infine, è possibile utilizzare un Java Agent per eseguire il push della strumentazione su tutti i metodi di tutti gli oggetti in fase di caricamento. La libreria javassist può aiutare a renderlo molto facile da fare. Quindi, è possibile aggiungere la tua traccia. La parte difficile sarebbe trovare un modo per ottenere l'output di traccia solo quando lo si desidera e non sempre, il che probabilmente rallenterebbe la JVM a una scansione. C'è un programma chiamato dtrace che funziona in un modo del genere. L'ho provato, ma non ha avuto molto successo. Tieni presente che gli agenti non possono instrumentare tutte le classi perché quelle necessarie per eseguire il bootstrap della JVM vengono caricate prima che l'agente possa instrumentare, quindi è troppo tardi per aggiungere strumentazione a quelle classi.

Correlati:Linux:trovare una sottostringa nei file nelle sottodirectory con un singolo comando integrato?

Il mio suggerimento – inizia con VisualVM e vedi se questo ti dice cosa devi sapere poiché può mostrare i thread correnti e le statistiche importanti per la JVM.


Linux
  1. Come usare BusyBox su Linux

  2. Come installare Python su Linux

  3. Come uso cron in Linux

  4. Come installare Java su Linux

  5. Come partizionare un disco in Linux

Come creare un file in Linux

Come rinominare le directory in Linux

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

Come installare FreeOffice su Linux

Come tracciare e tracciare un processo Linux

Come rintracciare un programma Java?