具有Heap Profiler功能的工具,如mat(memory analyse tool)、Google Heap Profiler、JProfiler等,经常会出现shallow heap与remainder heap,这两个词在我们的实际开发中基本没有出现过,那么我们在用mat解析dump出来的Java内存文件时,出现的这两个词究竟是什么意思呢?
shallow heap
shallow heap是对象本身的大小,不包括其引用的对象。
对于非数组类型:shallow heap就是对象与其成员变量加在一起的大小。
对于数组类型:shallow heap就是数组各个元素大小之和。
remainder heap
对象remainder heap 大小 = 对象shallow heap大小 + 对象直接或者间接引用的对象大小(排除被GC ROOT直接引用的对象)。
如下图所示:
对象引用关系
OBJECT A的remainder heap = OBJECT A的shallow heap
OBJECT B的remainder heap = OBJECT B的shallow heap + OBJECT C的对象大小 + OBJECT E的对象大小
所以对象的remainder heap其实接近进行垃圾回收时,清除该对象时所能获取的堆内存大小(有的对象可能还被其他对象引用,垃圾回收时,不能清除)。
下面是用mat对从服务器上面dump出来Java虚拟机内存进行解析之后的结果:
Java内存解析结果
其中,Objects为类的对象的个数。Shallow Heap是这些对象自身大小之和,Remainder Heap是这些对象自身以及这些对象直接或者间接引用的对象大小总和。
网友评论