shallow size是指对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。在32位系统上,对象头占8字节,int类型占4字节,不管成员变量(对象或数组)是否引用了其他对象或者赋值为null,它始终占4字节。故此,对于String对象实例来说,它有三个int型成员(“3*4=12”字节)、一个char[]型成员(“1*4=4”字节)以及一个对象头(8字节),总共“3*4+1*4+8=24”字节。根据这一原则,对String a=“rosen jiang”来说,实例a的shallow size也是24字节。
retained size是指该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。为了更好的理解retained size,不妨看个例子。
把内存中的对象看成图4-10中的节点,并且对象和对象之间互相引用。这里有一个特殊的节点GC Roots,这就是reference chain的起点。
(www.daowen.com)
图4-10 节点图
利用Strong Ref存储大量数据,直到heap被填满,利用interned strings(或者class loader加载大量的类)把perm gen填满。在上图4-11中,从obj1入手,深色节点代表仅仅只有通过obj1才能直接或间接访问的对象。因为可以通过GC Roots访问,所以左图的obj3不是深色节点;而在右图却是深色,因为它已经被包含在retained集合内。所以对于图4-11中的左图来说,obj1的retained size是obj1、obj2、obj4的shallow size总和;而右图的retained size是obj1、obj2、obj3、obj4的shallow size总和。obj2的retained size可以通过相同的方式计算。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。