Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?

原文在这里: Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?

Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?_第1张图片
扫一扫加关注【爪哇优太儿】

MAT是一款非常强大的JVM内存映像分析工具,对分析内存相关的问题非常有用,MAT报告中对对象大小的描述有两个相关的概念:
1.SHALLOW HEAP
2.RETAINED HEAP
本文就来介绍一下他们之间的区别。
首先我们来看下,这两个size是如何来计算的。
假如内存中存在以下的对象以及他们之间的引用关系,A引用了B和C,B引用了D、E,C引用了F、G,我们假设每一个对象本身在内存中是占10个字节,如下图所示:
Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?_第2张图片
在这里插入图片描述

SHALLOW HEAP大小:
一个对象的SHALLOW HEAP大小就是这个对象自己在内存中所占的字节数,本例中,每一个对象在内存中都是占用10个字节,因此这些对象的SHALLOW HEAP大小都是10字节。

对象B的RETAINED HEAP大小:
上图中得知,B引用了D和E,如果B被垃圾回收掉以后,D和E就没用引用,因此就可以被一起回收掉了,RETAINED HEAP的意思是当一个对象被回收以后总共可以释放的总的内存数量,因此对象B的RETAINED HEAP就等于B+D+E 的SHALLOW HEAP=30字节。

同理,C的RETAINED HEAP =C+F+G的SHALLOW HEAP =30字节。
同理,A的RETAINED HEAP = A+ B+ C + D + E+ F + G=70字节。
现在,我们修改下对象的引用关系,如下:


Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?_第3张图片
在这里插入图片描述

上图中,A的RETAINED HEAP是多少呢?答案是40字节!有木有大吃一斤?为啥呢?因为A被回收以后,只有C、F和G是可以一起被回收的,因此A的RETAINED HEAP = A + C + F + G的SHALLOW HEAP=40字节。

希望本文对你理解MAT的RETAINED 和 SHALLOW有所帮助,你也可以考虑使用另一款非常强大的内存分析工具HeapHero,它还可以分析出来由于不合理编程导致的内存浪费情况,比如:重复分配对象、没有充分使用的数据结构、非最优化的数据定义等等。

英文原文在这里:https://blog.gceasy.io/2019/01/03/shallow-heap-retained-heap/

你可能感兴趣的:(Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?)