Eclipse MAT 是一個功能強大的內存分析工具 但是我們在用它的dominator_tree的功能時候發(fā)現了Shallow Heap和Retained Heap這兩列光有數字卻沒有單位 經過一番查找后發(fā)現是 默認是以Byte來計算的 這也太不方便了

如果想可視化更好一些可以這么配置

修改之后在看就是

Shallow Heap和Retained Heap 是如何計算的呢

從圖中看出
Object A 持有 Object B 和 Object C
Object B 持有 Object D 和 Object E
Object C 持有 Object F 和 Object G
假設每個對象占用 10 byte
Shallow Heap Size
Shallow Heap Size 的計算比較簡單 就是每個對象在內存中的大小
Object A 的Shallow Heap Size 就是10 byte
Object B 的 Shallow Heap Size 也是 10 byte
Retained Heap Size
現在我們來計算Object B 的 Retained Heap Size 的大小
我們發(fā)現Object B 持有 Object D 和 Object E 并且Object D 和 Object E只被Object B 持有 如果發(fā)生內存回收Object B被回收的同時 Object D 和 Object E 也會被回收
那么Object B 的Retained Heap Size 大小為
= Object B (shallow heap size) + Object D (shallow heap size) + Object E (shallow heap size)
= 10 bytes + 10 bytes + 10 bytes
= 30 bytes
再來看一種情況

在這種情況下, Object A的retained heap size 的大小是 40 bytes. Surprising? Puzzling?
如果 Object A 被垃圾回收 那么只有 Object C , Object F 和 Object G會被回收 而Object B Object D 和Object E會繼續(xù)存在內存中 因為他們被Object H持有
因此, Object A 的retained heap size 計算方法是:
= Object A (shallow heap size) + Object C (shallow heap size) + Object F (shallow heap size) +Object G (shallow heap size)
= 10 bytes + 10 bytes + 10 bytes + 10 bytes
= 40 bytes.