Eclipse MAT 是一個(gè)功能強(qiáng)大的內(nèi)存分析工具 但是我們?cè)谟盟膁ominator_tree的功能時(shí)候發(fā)現(xiàn)了Shallow Heap和Retained Heap這兩列光有數(shù)字卻沒有單位 經(jīng)過一番查找后發(fā)現(xiàn)是 默認(rèn)是以Byte來(lái)計(jì)算的 這也太不方便了
如果想可視化更好一些可以這么配置
修改之后在看就是
Shallow Heap和Retained Heap 是如何計(jì)算的呢
從圖中看出
Object A 持有 Object B 和 Object C
Object B 持有 Object D 和 Object E
Object C 持有 Object F 和 Object G
假設(shè)每個(gè)對(duì)象占用 10 byte
Shallow Heap Size
Shallow Heap Size 的計(jì)算比較簡(jiǎn)單 就是每個(gè)對(duì)象在內(nèi)存中的大小
Object A 的Shallow Heap Size 就是10 byte
Object B 的 Shallow Heap Size 也是 10 byte
Retained Heap Size
現(xiàn)在我們來(lái)計(jì)算Object B 的 Retained Heap Size 的大小
我們發(fā)現(xiàn)Object B 持有 Object D 和 Object E 并且Object D 和 Object E只被Object B 持有 如果發(fā)生內(nèi)存回收Object B被回收的同時(shí) Object D 和 Object E 也會(huì)被回收
那么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
再來(lái)看一種情況
在這種情況下, Object A的retained heap size 的大小是 40 bytes. Surprising? Puzzling?
如果 Object A 被垃圾回收 那么只有 Object C , Object F 和 Object G會(huì)被回收 而Object B Object D 和Object E會(huì)繼續(xù)存在內(nèi)存中 因?yàn)樗麄儽籓bject H持有
因此, Object A 的retained heap size 計(jì)算方法是:
= 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.