shallow heap与remainder heap

 

具有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是这些对象自身以及这些对象直接或者间接引用的对象大小总和。



作者:哪个旮旯的
链接:https://www.jianshu.com/p/def81f647ece
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2023-11-20 17:02  沧海一滴  阅读(272)  评论(0编辑  收藏  举报