MAT基础知识:Shallow和Retained Size

MAT基础知识:Shallow和Retained Size

对于所有独立的对象,包括对象的结合都有他们自己的shallow size和retained size。

Shallow Size

一个对象的Shallow Size是指用于存储其本身的内存大小,这其中并不包括它所引用的其他对象大小。一个常规对象(非数组类型的对象)的Shallow Size依赖于其成员数量和类型。而对于数组而言,就依赖于数组长度以及其元素(对象或其他基本类型)类型。一个对象集合的Shallow Size则为其内所有的对象的Shallow Size的总和。

Retained Size

一个对象的Retained Size则为它自己加上仅仅从它自己出发的所有可达对象(也就是所吃持有的引用对象,无论直接或者间接)的Shallow Size之和。换言之,Retained Size就是指该对象被回收后可以释放的内存。总体而言,retained size是帮助理解内存结构、对象间依赖性以及寻找对象连通图潜在根节点的一种不必可少的手段。

举例

为了更好地理解retained size的概念,让我们来看下面的两个例子。

为了计算Retained Size,系统将所有内存中的对象视为有向图中的一个节点。图的边以及指向代表了对象间的引用关系。这里有个特殊的点,GC(Garbage Collection)根节点,它并不会被垃圾回收器处理。

下面的两幅图片展示了两个相同对象的集合,但是它们的内部引用状态并不相同

MAT基础知识:Shallow和Retained Size_第1张图片

图片1
MAT基础知识:Shallow和Retained Size_第2张图片

图片2

让我看一下对象1.

如你所见,我们对obj1直接或间接引用的对象都做了高亮处理,如果你看图1,你会看到obj3并没有高亮,因为它也被GC root所引用着。而图2,obj3却被没有被高亮,因为不像obj5,它并没有被另外的节点root引用着。

因此,obj1的Retained Size应该这样计算

  • 图1中:obj1,2,4和ShallowSize的总和
  • 图2中:obj1,2,3,4的ShallowSize的总和

而对于obj2,却应该被这样计算

  • 图1中:obj2,4的Shallow Size的和
  • 图2中:obj2,3,4的Shallow Size的和

你可能感兴趣的:(android)