Shallow Heap 和 Retained Heap的区别

Shallow Size

Shallow Size是对象本身占据的内存的大小,不包含其引用的对象。对于常规对象(非数组)的Shallow Size由其成员变量的数量和类型来定,而数组的ShallowSize由数组类型和数组长度来决定,它为数组元素大小的总和。

Retained Size

Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C,C就是间接引用) ,并且排除被GC Roots直接或者间接引用的对象

换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。

GC Roots直接引用了A和B两个对象。

A对象的Retained Size=A对象的Shallow Size
B对象的Retained Size=B对象的Shallow Size + C对象的Shallow Size

栗子:


Shallow Heap 和 Retained Heap的区别_第1张图片

上图中obj1的retained size为obj1、obj2、obj4的shallow size总和,并不包括obj3的shallow size,因为obj3被Gc Roots引用了,也就是说obj3除了被obj2引用,还有其他外部引用。

Shallow Heap 和 Retained Heap的区别_第2张图片

上图中obj1的retained size为obj1、obj2、obj3、obj4的shallow size总和,因为obj3除了被obj2引用,没有其他外部引用。

参考:
http://blog.csdn.net/hhww0101/article/details/8133219
http://supercharles888.blog.51cto.com/609344/1347144
http://blog.csdn.net/kingzone_2008/article/details/9083327

你可能感兴趣的:(java基础学习)