2016-03-03 101 views
1

我正在使用Eclipse Memory Analyzer查看HPROF文件。它顯示爲同一類的不同實例不同數量的字段:Java HPROF堆轉儲丟失字段?

看來字段缺少可能永遠不會被分配到,但什麼是在那些缺少字段中的值?它們是「零」值還是來自字段初始化程序的值?

編輯:

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

編輯2:

似乎缺少字段不爲 「零」(通過調試確認),但可能永遠不會分配給。

以下OQL查詢顯示,Eclipse的內存分析器其實知道這些字段中的實際值,而只是選擇不顯示他們...

+0

你在說哪個'fields'?在這裏,我看到所有條目都有兩個字段 –

+1

@AswinMurugesh截圖中只有兩個實例。一個列出2個字段,另一個有9個! –

回答

2

據的的HProf format documentation所有領域對象存儲在轉儲中,所以MAT可以知道對象的所有字段的值。


OQL窗口

對於OQL的所有引用顯示除了那些,具有空值。

myWorkspaceMap is null for the object with 9 attributes


支配樹窗口 對於我來說MAT顯示了支配樹窗口對象的所有屬性。

Attributes window

由於idea of the dominator tree是具有無環圖MAT確定closeController自己URLJarFile對象和不顯示在主窗口此屬性。

,也意味着,如果有對特定對象的幾個強引用,並不能確定對象的對象的所有者將不被顯示在支配樹。

考慮在URLJarFile的name屬性:

Name is not shown in the dominator tree

如果我們選擇「列出對象 - >與傳入引用」我們可以看到,這個字符串是由若干對象引用:

String is referenced from several objects

+0

從技術上講,這與支配者功能無關,因爲我的屏幕截圖清楚地表明我使用傳出引用而不是傳入。顯然,應該有可能確定性地知道給定對象引用了哪些對象。 –

+0

但是你的屏幕截圖讓我知道了正確的方向。 –

+0

但是我認爲你在編輯2之前使用了支配樹。對於OQL,我已經放置瞭解釋你的情況的截圖。 – Taky

0

問題是我正在查看的視圖只能列出對象引用,所以null字段或原始值不顯示。

解決方案是添加「Inspector」視圖或切換到專用的「Memory Analysis」透視圖,該透視圖將顯示每個選定實例的實際字段,如@Taxy截圖所示。