Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Eclipse memory analyzer: introduzione e concetti di base

Identificare perdite di memoria con Eclipse Memory Analyzer
Identificare perdite di memoria con Eclipse Memory Analyzer
Link copiato negli appunti

L'Eclipse Memory Analyzer (MAT) è un progetto rilasciato sotto licenza Open Source e concepito per l'analisi di dumps dell'heap allo scopo di identificare perdite di memoria e di ottimizzarne l'utilizzo. Come visto in precedenza, i grafici della JConsole ci consentono di stabilire con buona approssimazione che l'heap è soggetto a perdite, pur senza essere in grado di dirci dove si trova la perdita. Il Memory Analyzer ci permette di fare un ulteriore passo e individuare dove si annida la perdita, riducendo la necessità di lunghi monitoraggi della memoria grazie a una ricerca di potenziali problemi basata su anti-patterns.

In questa sezione si fornirà qualche cenno in più sulla creazione dei dumps e sulla descrizione dei concetti alla base del funzionamento del MAT.

Heap Dump

Il Memory Analyzer lavora con dumps in formato di tipo binario HPROF, dumps prodotti dall'HotSpot della Sun e Virtual Machine derivate. Vi sono diverse modalità per ottenere i dumps, divisibili in modi interattivi e non interattivi.

La modalità non interattiva si basa sui parametri della Virtual Machine. -XX:+HeapDumpOnOutOfMemoryError permette di ottenere un dump dell'heap al primo OutOfMemoryError. In alcuni casi può risultare l'unico modo per ottenere un dump. Settando il parametro -XX:HeapDumpPath=[path] è possibile specificare dove memorizzare il dump.

Con le modalità interattive si potrà ottenere dei dumps su richiesta. Nelle piattaforme Windows, come visto nella sezione precedente, ciò è possibile tramite la JConsole, mentre sulle distribuzioni basate sul Kernel Linux e i sistemi operativi (Mac) OS X è possibile utilizzare anche JMap (da Java 5).

Inoltre, è possibile utilizzare lo stesso Memory Analyzer per generare i dumps da analizzare. Con un'apposita estensione (denominata IBM DTFJ) infine è possibile analizzare dumps di sistemi IBM.

Eclipse Memory Analyzer e Java Memory Leaks

Lo Shallow heap è la memoria occupata da un oggetto. Ad esempio 32 (o 64 a seconda dell'architettura) bits per i riferimenti, 4 bytes per gli Integer e così via. Il Retained set di un oggetto è l'insieme di oggetti che sarebbero rimossi nel momento in cui l'oggetto venisse preso in carico dal Garbage Collector (l'oggetto in questione sarebbe incluso nel set). Il Retained set di un oggetto pertanto è la somma degli shallow sizes di tutti gli oggetti appartenenti al retained set dell'oggetto in questione, in definitiva la memoria mantenuta attiva dall'oggetto. Detto altrimenti, è la memoria heap che sarebbe liberata nel momento in cui l'oggetto venisse deallocato.

I nodi radice sono invece parametri dei metodi, oggetti creati localmente e così via.

Il Memory Analyzer lavora su approssimazioni del retained size, eseguendo l'analisi sull'insieme degli oggetti ispezionati ed evitando di lavorare su tutti gli oggetti nel dump, risparmiando conseguentemente sui tempi di analisi.

Dominator Tree e Garbage Collection Roots

Il Memory Analyzer crea un albero delle dipendenze trasformando il grafo dei riferimenti in un dominator tree, consentendo di identificare semplicemente i principali blocchi di memoria occupati e le dipendenze ancora attive tra questi oggetti.

Sostanzialmente un oggetto "x" ne domina un altro "y" se ogni percorso nel grafico dei riferimenti per raggiungere "y" deve passare per "x". L'immediato dominatore di "y" è il dominatore più vicino ad "y". Ottenuto il dominator tree, ogni oggetto dell'albero è l'immediato dominatore dei suoi figli, così che le dipendenze tra oggetti sono identificabili semplicemente.

Un Garbage Collection Root è invece un oggetto accessibile dall'esterno dell'heap. Vi troviamo classi di sistema (ad esempio java.util.*), variabili locali in codice nativo, threads attivi, altre variabili locali etc.

Nella figura seguente è possibile visualizzare un esempio schematico. Sulla sinistra, A e B sono Garbage Collection Roots. Preso in considerazione il solo oggetto C, il relativo retained set sarà composto da C, D, E, F. Preso in considerazione il set che include anche gli elementi roots A e B, il retained set sarà A, B, C, D, E, F. Sulla destra vediamo il corrispondente dominator tree.

Figura 1. Retained set e dominator tree.
Retained set e dominator tree

Dopo aver analizzato le caratteristiche principali di Eclipse memory analyzer e la sua utilità nella rilevazione delle perdite di memoria, nel prossimo capitolo verrà affrontata la procedura per la sua installazione e descritte alcune operazioni basilari eseguibili con questo strumento.

Ti consigliamo anche