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:
/opt/jdk/7.0_85/bin/jmap
Questa è la sintassi per effettuare il dump della memoria Heap in formato binario hprof:
jmap -dump:file=/var/dump/application.hprof pid
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.
Java HotSpot(TM) 64-Bit Server VM (24.85-b06) for linux-amd64 JRE (1.7.0_85-b15), built on Jun 8 2015 18:50:27 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8) Memory: 4k page, physical 3907408k(2024488k free), swap 6291452k(6150788k free) CommandLine flags: -XX:CompileCommandFile=/opt/oracle-mw/config-12/common/hotspot_compiler -XX:+DisableExplicitGC -XX:HeapDumpPath=/spimi/tmp/bban0/ -XX:InitialHeapSize=1073741824 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=134217728 -XX:MaxPermSize=536870912 -XX:MaxTenuringThreshold=31 -XX:NewSize=134217728 -XX:OldPLABSize=16 -XX:ParallelGCThreads=3 -XX:PermSize=536870912 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=6 -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 2019-05-20T17:02:57.481+0200: 5.350: [GC2019-05-20T17:02:57.481+0200: 5.350: [ParNew: 98304K->15755K(114688K), 0.0374830 secs] 98304K->15755K(1032192K), 0.0375900 secs] [Times: user=0.05 sys=0.01, real=0.03 secs] 2019-05-20T17:03:01.720+0200: 9.589: [GC2019-05-20T17:03:01.720+0200: 9.589: [ParNew: 114059K->16384K(114688K), 0.1030770 secs] 114059K->28497K(1032192K), 0.1031730 secs] [Times: user=0.10 sys=0.01, real=0.10 secs] 2019-05-20T17:59:33.800+0200: 174774.202: [Full GC2019-05-20T17:59:33.800+0200: 174774.202: [CMS2019-05-20T17:59:34.185+0200: 174774.587: [CMS-concurrent-mark: 0.625/0.633 secs] [Times: user=0.75 sys=0.00, real=0.63 secs]
Affinche venga creato il gc.log, è necessario far partire la JVM con questi “flags”:
- fino a Java 8
-XX:+PrintGCDetails -Xloggc:/opt/tmp/myapp-gc.log
- da Java 9
-Xlog:gc*:file=/opt/tmp/myapp-gc.log -Xlog:gc*::time (time stamp)
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 è:
jstack -l pid > /var/dump/TD.log
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 (GitHub link)
- 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.
Per modificare la “prospettiva” di Eclipse e attivare la modalità “analisi heap dump” o “analisi garbage collector”, è necessario spostarsi nel menu delle Perspective.
GCMV perspective
Per analizzare e visualizzare il grafico del Garbage collector log, seleziona la voce GCMV.
Per analizzare e visualizzare il grafico del Garbage collector log, seleziona la voce GCMV.
MAT e MAT Easy! perspective
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.
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).
Con l’analisi “Leak suspect” è stato automaticamente identificato un Thread in STUCK, contenente il macro oggetto sopra evidenziato.
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.
MAT Easy! – Analisi facilitata Heap dump
MAT Easy! è il plugin che semplifica la visione dei dati presenti nel Dominator tree.
Come puoi vedere nell’immagine chebsegue, possiamo i fatti dell’Heap dump da un’altra prospettiva.
MAT Easy! ti facilita la vita cliccando sul tasto Collection Tree
Come puoi vedere qui sopra, il risultato è molto più leggibile e a colpo d’occhio riesci ad identificare la classe colpevole dell’anomalia, senza dover esplodere migliaia di alberature ricorsive.
Buona analisi delle tue applicazioni Java! 😉
My contacts are in the footer below