MAT工具中Shallow heap和Retained heap是如何計算的

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


WX20201028-194543@2x.png

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


size_units_cfg.png

修改之后在看就是


size_units_sample.png

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

Shallow-heap-1.png

從圖中看出
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
再來看一種情況


Shallow-heap-3-1.png

在這種情況下, 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.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容