Eclipse MAT 是一个功能强大的内存分析工具 但是我们在用它的dominator_tree的功能时候发现了Shallow Heap和Retained Heap这两列光有数字却没有单位 经过一番查找后发现是 默认是以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 的大小
我们发现Object B 持有 Object D 和 Object E 并且Object D 和 Object E只被Object B 持有 如果发生内存回收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会继续存在内存中 因为他们被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.
网友评论