Eclipse, analisi Java Heap Dump e Garbage collector

Come usare Eclipse con i plugin MAT, MAT Easy! e GCVM per analizzare Heap dump e Garbage Collector.

Java è il linguaggio di programmazione più diffuso al mondo ed esistono molti tool per analizzare le applicazioni web e Android sviluppate con questo linguaggio.

Gran parte delle Web Application odierne utilizzano Application Server JavaEE come Oracle Weblogic.

Per iniziare l’analisi di un’applicazione Java è necessario raccogliere alcuni dati fondamentali:

  • Heap dump: il dump della memoria della JVM (Java Virtual Machine) .
  • Garbage collector log: il “gc.log” dove vengono tracciate tutte le operazioni di pulizia della memoria della JVM.
  • Thread dump: il dump dei thread applicativi.

I comandi che seguono sono stati eseguiti su piattaforma Oracle Java e Weblogic.

Come fare un Heap dump.

Il dump della Heap ti aiuterà ad osservare gli oggetti presenti in memoria in quell’istante. Questo ti permette di identificare referenze che possono essere causa di “out of memory”,”memory leak”, etc.
Per fare questa operazione, utilizza il comando jmap presente nella cartella di installazione dei binari di java:

Questa è la sintassi per effettuare il dump della memoria Heap in formato binario hprof:

Qui sopra “pid” è il Process ID del processo della JVM (Java Virtual Machine) o dell’application server Weblogic.

Come creare il Garbage collector log.

Il Garbage collector log, anche detto gc.log, è il file di testo dove vengono memorizzate tutti gli eventi di pulizia della memoria della JVM: MinorGC, MajorGC e FullGC.

Affinche venga creato il gc.log, è necessario far partire la JVM con questi “flags”:

  • fino a Java 8

  • da Java 9

Come fare il Thread dump.

Il Thread dump fotografa lo stato dei thread di un processo. Nel caso di Weblogic, ci permette di capire in quale “state” sono i Thread dell’application server. Tra gli stati più interessanti:

  • STANDBY: il thread è in attesa di eseguire un’operazione
  • ACTIVE: il thread sta eseguendo un’operazione e viene riportato lo stacktrace
  • STUCK: il thread viene etichettato stuck dopo un determinato lasso di tempo impostato sull’admin del dominio Weblogic. Potenzialmente questo thread potrebbe essere bloccato o sta eseguendo un’operazione che ci sta mettendo più di X minuti (soglia sull’admin).

La sintassi per eseguire un Thread dump è:

Eclipse per analizzare Heap dump e Garbage collector log

Per analizzare i dati appena raccolti, utilizza l’ide Eclipse con l’aggiunta dei plugin: MAT, MAT Easy! e GCMV.

Il link al sito ufficiale per scaricare Eclipse è https://www.eclipse.org/downloads/.
Dal marketplace di Eclipse è poi necessario installare:

  • Memory Analyzer (MAT): plugin per analizzare gli heap dump in formato hprof
  • MAT Easy!: plugin che facilita l’analisi dell’Dominator tree
  • GCMV: plugin per graficare il garbage collctor log

Usare le Perspective di Eclipse

Per poter utilizzare i plugin è necessario cambiare la “perspective” del workspace di Eclipse.

come cambiare perspective in EclipsePer modificare la “prospettiva” di Eclipse e attivare la modalità “analisi heap dump” o “analisi garbage collector”, è necessario spostarsi nel menu delle Perspective.

GCMV perspective

come selezionare la perspective di GCMVPer analizzare e visualizzare il grafico del Garbage collector log, seleziona la voce GCMV.

MAT e MAT Easy! perspective

come selezionare la perspective di MAT e MAT Easy!Per analizzare gli Heap dump *.hprof, seleziona la prospettiva Memory analisys.

GCMV – Analisi Garbage Collector log.

Nella perspective di GCMV puoi analizzare e osservare l’andamento delle operazioni del Garbage Collector.

esempio di garbage collector log graficato con GCMV

Graficare il log della garbage collection, è utile per identificare il comportamento dell’applicazione. Tra gli aspetti più interessanti:

  • LINEA AZZURRA: in questo caso specifico puoi notare come l’applicazione abbia un problema di saturazione della memoria che da circa 100mb passa a 400-500mb in pochi minuti creando una rampa. Il problema in se non è la crescita dell’utilizzo di memoria ma il fatto che non venga più liberata causando un Out of Memory (OOM).
  • LINEA AF: i punti fucsia identificano le operazioni di pulizia di tipo MinorGC (Young generation).
  • LINEA FULL: i punti fucsia identificano le operazioni di garbage collection di tipo FullGC (Young + Old).
  • LINEA ROSSA: indica la durata dell’operazione di garbage collection, sia Minor che Full.

MAT – Analisi Heap dump.

Questa è la prima schermata che ti apparirà appena terminato il parsing del dump hprof. Grazie al diagramma a torta, puoi facilmente identificare un oggetto di grandi dimensioni (181 mb) in rapporto alla dimensione della Heap (512mb in questo caso).

Eclipse visualizza oggetti contenuti nell' heap dump

Con l’analisi “Leak suspect” è stato automaticamente identificato un Thread in STUCK, contenente il macro oggetto sopra evidenziato.

Problem Suspect è il risultato dell'analisi Leak Suspect

Aprendo il Dominator tree e ordinandolo per Retained Heap, puoi notare l’oggetto weblogic.work.ExecuteThread ‘4’ in STUCK. Lo stesso segnalato dall’analisi Leak Suspect.

Thread in Stuck nel Dominator Tree

MAT Easy! – Analisi facilitata Heap dump

MAT Easy! è il plugin che semplifica la visione dei dati presenti nel Dominator tree.

Classi Java nel Dominator Tree

Come puoi vedere nell’immagine qchebsegue, possiamo i fatti dell’Heap dump da un’altra prospettiva.

MAT Easy! ti facilita la vita cliccando sul tasto Collection Tree mat easy! collection tree button

MAT Easy! Collection Tree analisys

Come puoi vedere, il risultato è molto più leggibile e a colpo d’occhio riesci ad identificare la classe colpevole dell’anomalia, senza dover esplodere migliaia di alberature, spesso ricorsive.

Buona analisi delle tue applicazioni Java! 😉