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

Eclipse memory analyzer: strumenti e funzionalità

Funzionalità principali di Eclipse memory analyzer, dagli strumenti per l’acquisizione dei dump della memoria all'istogramma sul numero di oggetti istanziati per ogni classe, dai report utili per contenere sprechi di memoria alle Query sugli oggetti con QQL fino al confronto tra oggetti.
Funzionalità principali di Eclipse memory analyzer, dagli strumenti per l’acquisizione dei dump della memoria all'istogramma sul numero di oggetti istanziati per ogni classe, dai report utili per contenere sprechi di memoria alle Query sugli oggetti con QQL fino al confronto tra oggetti.
Link copiato negli appunti

Dopo aver mosso i primi passi nell’utilizzo del MAT ed eseguito una prima analisi dei potenziali buchi di memoria, passiamo a una rassegna dei principali strumenti e funzionalità.

Dump della memoria

MAT ci mette a disposizione un wizard per l’acquisizione dei dump della memoria heap, evitandoci così di dover passare dalla JConsole o per altri strumenti o direttive della JVM.

Dalla vista nell’IDE o direttamente dallo standalone: "File > Acquire Heap Dump…"

Figura 1. Acquisizione del dump tramite MAT
Acquisizione del dump tramite MAT

Come nella JConsole, ci verrà data la possibilità di selezionare il processo a cui siamo interessati, quindi specificare cartella e nome del file di destinazione e premere su "Finish" per la cattura del dump. Seguirà automaticamente la fase di apertura e analisi del dump (e quindi di costruzione dell’albero del Dominator Tree etc.).

Tra le voci attivabili nella sezione "Actions" dell’oveview è possibile richiamare l’istogramma, una lista con il numero di oggetti istanziati per ogni classe. Aprendo l’istogramma, vedremo che oltre al numero di istanze, è presente l’indicazione sullo shallow heap e sul retained heap, in modo da avere un’indicazione sia del peso degli oggetti in questione che del peso degli oggetti che stanno mantenendo attivi.

La lista è presentata per classi, ma può risultare comodo visualizzare i dati in un altro modo. E’ dunque possibile raggruppare i risultati per superclasse, class loader o package. Raggruppando ad esempio per package sarà in seguito possibile navigare i diversi package fino alle relative classi istanziate, come mostrato nell’immagine seguente.

Figura 2. Istogramma, raggruppamento per package
Istogramma, raggruppamento per package

Premendo con il tasto destro su una delle voci si potrà scegliere tra diverse azioni eseguibili. Fra queste la ricerca per gli Immediate Dominators, una query che trova e aggrega tutti gli oggetti che dominano il set di oggetti selezionato, utile a individuare rapidamente chi li sta mantenendo attivi. E’ anche possibile filtrare dalla ricerca classi cui non siamo interessati (opzione "skip").

Utile funzionalità è offerta dall’ultimo dei pulsanti nella barra di stato connessa alla scheda "Histogram". Se si sono aperti nell’editor diversi dump, è possibile eseguirne un rapido confronto verificando variazioni nel numero di oggetti istanziati e del relativo spazio allocato.

Sempre dalla stessa sezione "Actions", è possibile attivare il Dominator Tree con la lista esplorabile degli oggetti attivi e il Top Consumers che mostra gli oggetti più ingombranti raggruppati per classe e package (accompagnati con grafo a torta se BIRT è presente nell’IDE). Infine, è possibile accedere alla voce "Duplicate Classes" per verificare la presenza di classi caricate da diversi class loaders.

Top components

Tra le voci attivabili nel menu "reports" oltre all’analisi dei leak sospetti è possibile eseguire un’analisi dei "Top Components", un report riguardante quei componenti che occupano più dell’1% dell’heap e il cui scopo è aiutarci nel contenere sprechi di memoria e migliorarne l’utilizzo.

Attivando la voce "Possible Memory Waste" veniamo informati sulla eventuale presenza di stringhe duplicate, collezioni di oggetti vuote, o semivuote.

La voce "Miscellaneous" ci fornisce una serie di utili statistiche su soft e weak references (i soft references sono elementi che vengono collezionati dal garbage collector solo in caso di memoria ritenuta bassa, al contrario dei weak reference che vengono sempre collezionati), oggetti che implementano il metodo finalizer (verificando la presenza di eventuali finalize bloccati o in azione per lungo tempo), frequenza di collisioni su collezioni di tipo Map.

OQL: Query sugli oggetti dell’heap

Tra gli strumenti messi a disposizione da MAT c’è anche un motore per eseguire query personalizzate con un linguaggio simile a quello dell’SQL, utile per raffinare le ricerche ed isolare aspetti da approfondire. Per utilizzarlo vi è un pulsante nella barra di stato ("Open Object Query Language") con cui inserire la query desiderata. OQL rappresenta classi come tabelle, oggetti come righe e relativi campi come colonne. Le query pertanto seguiranno la seguente sintassi:

SELECT *
FROM [ INSTANCEOF ] <class name="name">
[ WHERE <filter-expression> ]
</filter-expression></class>

L’editor OQL si presenta come un’area di testo destinata ad ospitare la query. Per eseguirla, vi è un pulsante rosso nel menu di stato contestuale, come da figura seguente. Una volta elaborata la query, al di sotto dell’area di testo comparirà una nuova area con i risultati della query richiesta. Le informazioni fornite dalla query sono informazioni statistiche circa la memoria allocata dagli oggetti individuati.

Figura 3. OQL esecuzione di una query
OQL esecuzione di una query

Nella scheda "Navigation History" sarà possibile trovare le query eseguite. Se la relativa scheda è aperta, la query sarà considerata attiva. E’ possibile avere diverse query attive aprendo una nuova scheda OQL per ogni interrogazione da effettuare.

Confronto tra oggetti

Gli identificativi degli oggetti forniti dal dump supportato da MAT riguardano indirizzi di memoria, ma gli oggetti sono spesso mossi all’interno dell’heap dalla JVM durante le attività di routine del GC, per cui questi indirizzi non sono utilizzabili per confronti tra oggetti. In pratica, ciò implica che dump anche successivi e anche eseguiti sullo stesso processo non rendono possibile puntare allo stesso oggetto. Quelli che si eseguono pertanto sono confronti su risultati aggregati e analisi sulla dimensione degli oggetti e sull’area che mantengono attiva, verificando se è cambiata.

Oltre al confronto già visto in precedenza tra due o più heap, MAT permette di eseguire confronti tra un numero arbitrario di risultati tabellari, provenienti o meno dallo stesso dump. E’ possibile quindi confrontare retained set di specifici package su diversi dump o verificare come vari il retained set di specifici oggetti dello stesso dump.

Cliccando con il destro su una query archiviata nel "Navigation History", potremo selezionare dal relativo menu la voce "Add to Compare Basket". Si dovrà fare attenzione che la query sia attiva, ossia per ogni query deve essere presente una scheda OQL con la query eseguita, altrimenti non sarà possibile aggiungere la query al Compare Basket. Ad esempio, nell’ipotesi di aver eseguito le seguenti due query su due schede OQL diverse:

select * from "memoryleak.data.Persona" Q where (toString (Q.nome)) = "Pippo"
select * from "memoryleak.data.Persona" Q where (toString (Q.nome)) = "Pluto"

Possiamo accedere al Navigation History, cliccare con il tasto destro del mouse sulle due query per aggiungerle al Compare Basket, quindi verificare sulla scheda Compare Basket la presenza delle relative voci. Nel menu contestuale un pulsante rosso con un punto esclamativo ci permetterà di eseguire il confronto.

Il confronto è basato su due colonne per ogni query, ossia per ogni query ci verrà mostrato Shallow e Retained Hep. Di base il confronto è sui valori assoluti, ma vi è un pulsante ("choose difference option…") che consente di visualizzare la differenza (assoluta o percentuale) di valori rispetto alla tabella di riferimento, tabella identificata dalla prima query tra quelle presenti nel Compare Basket. Le frecce nel menu contestuale consentono poi di modificare l’ordine e quindi la tabella di riferimento.

Ti consigliamo anche