Shallow Size:
Shallow size就是对象本身占用内存的大小,不包含其引用的对象。
- 常规对象(非数组)的 Shallow size 由其成员变量的数量和类型决定。
- 数组的shallow size有数组元素的类型(对象类型、基本类型)和数组长度决定。
在32位系统上,
- 对象头占用 8 字节
- int 占用4字节
- 不管
成员变量
(对象或数组)是否引用了其他对象(实例)或者赋值为null它始终占用4字节。
故此,对于String对象实例
来说,它有三个 int 成员(34=12字节)、一个 char[] 成员(14=4字节)以及一个对象头(8字节),总共34 +14+8=24字节。
根据这一原则,对 String mStr=”rosen jiang”
来说,实例 mStr
的shallow size
也是24字节。(注意:上述String是jdk1.5的,代码如下:)
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0
.....
}
Retained Size:
对象的Retained Size = 对象本身的Shallow Size + 对象能直接或间接访问到的对象的Shallow Size
也就是说 Retained Size
就是该对象被 Gc
之后所能回收内存的总和。
为了更好地理解Retained Size,看下图对象的引用对象可以归纳为:该对象到其他对象有引用关系并且该引用对象到 Gc Root
节点是不可达的,所以有
- 左图
obj1 的 Retained Size
=obj1 + obj2 + obj4 的 Shallow size
- 右图
obj1 的 Retained Size
=obj1 + obj2 + obj4 +obj3 的 Shallow size
总之,Retained size是一个整体度量,能反映内存结构和对象图的依赖关系,还可以找到根节点。
在进行垃圾回收时,如果实例对象到 Gc Root 是不可达的,那么该对象会被回收,如下图的 Object F 和 Object I
Heap Size:
堆的大小,当资源增加,当前堆的空间不够时,系统会增加堆的大小,若超过上限(如64M,阈值视平台而定)则会被杀掉 。
Allocated:
堆中已分配的大小,即 App 应用实际占用的内存大小,资源回收后,此项数据会变小。
建议:若单一操作反复进行,堆大小一直增加,则有内存泄露的隐患,可采用MAT进一步查看。
https://blog.csdn.net/yincheng886337/article/details/50517375
https://blog.csdn.net/kingzone_2008/article/details/9083327
http://www.blogjava.net/rosen/archive/2010/05/21/321575.html