Java HPROF heap dump campi mancanti?


Sto usando Eclipse Memory Analyser per visualizzare un file HPROF. Visualizza un numero diverso di campi per diverse istanze della stessa classe:

Sembra che i campi mancanti potrebbero non essere mai stati assegnati, ma qual era il valore in quei campi mancanti? Sono il valore "zero" o il valore dell'inizializzatore di campo?

Modifica:

JVM è Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

Modifica 2:

Sembra che i campi mancanti non siano "zero" (come confermato attraverso debugging), ma probabilmente mai assegnato a.

La query OQL sottostante mostra che Eclipse Memory Analyser conosce effettivamente i valori reali in quei campi, ma ha semplicemente scelto di non visualizzarli...

Author: billc.cn, 2016-03-03

2 answers

Secondo la Documentazione in formato HProftutti i campi dell'oggetto sono memorizzati nel dump, quindi MAT può conoscere il valore di tutti i campi dell'oggetto.


Finestra OQL

Per OQL vengono mostrati tutti i riferimenti tranne quelli, che hanno valore null.

myWorkspaceMap è null per l'oggetto con 9 attributi


Finestra albero dominatore Per me MAT mostra tutti gli attributi dell'oggetto nella finestra dell'albero dominatore.

Finestra Attributi

Dal momento che l'idea dell'albero del dominatore è di avere acyclic graph MAT determinato che closeController possiede l'oggetto URLJarFile e non mostra questo attributo nella finestra principale.

Inoltre, significa che se ci sono diversi riferimenti forti all'oggetto particolare e il proprietario dell'oggetto non può essere identificato, l'oggetto non verrà visualizzato nell'albero del dominatore.

Considera l'attributo name nell'URLJarFile:

Il nome non è mostrato nell'albero del dominatore

Se scegliamo "Oggetto Elenco -> con i riferimenti in entrata " possiamo vedere che questa stringa è referenziata da diversi oggetti:

La stringa è referenziata da diversi oggetti

 2
Author: Taky, 2016-03-03 12:59:40

Il problema è che la vista che stavo guardando dovrebbe solo elencare refereces dell'oggetto, quindi i campi null oi valori primitivi non vengono mostrati.

La soluzione è aggiungere la vista "Inspector" o passare alla prospettiva dedicata "Analisi della memoria", che mostrerà i campi effettivi per ogni istanza selezionata, come mostrato negli screenshot di @Taky.

 0
Author: billc.cn, 2016-03-03 13:11:11