MAT分析器中的shallow and retained heap详解

        在MAT分析中两个特别重要的参数shallow heap 和retained heap是帮助我们分析内存的重要依据。一个对象的shallow heap的大小指的是该对象在没有引用其他对象的情况下本身占用的内存大小。一个普通对象的shallow heap 的大小(不包括数组类型)依赖于它含的方法,元素的大小。而一个数组类型的shallow  heap的大小则依赖于数组的长度和数组里面元素的类型。集合类型的shallow heap的大小则指的是集合所包含的所有对象的大小的总和。这么说有点抽象,下面拿一个实例来分析。
 


public class Person {
    public int age;
    public String name;
    public double height;

    public Person(int age, String name, double height) {
        this.age = age;
        this.name = name;
        this.height = height;
    }

}

public class MyoomTest {

    public static void main(String[] args) {
        List<Person> users = new ArrayList<Person>();
        int i = 0;
        while (true) {
            users.add(new Person(24, "hanking", 1.72));
            i++;
            System.out.println("i=:" + i);
        }
    }
}
 

        在MyoomTest中引用了UserBean和Person两个类。同时为了尽快出现oom应该把run as中run configuration中的Arguments中的VmArguments中输入-Xms5m -Xmx5m -XX:+HeapDumpOnOutOfMemoryError,其中的-Xms5m -Xmx5m –XX指的是虚拟机的内存,这里把虚拟机的最大内存和最小内存都设置为5m只要运行内存超过了5m 就会报outofmemory异常。其中eapDumpOnOutOfMemoryError是为了在产生内存溢出的时候保存hprof文件,hprrof文件是MAT分析所使用的文件。
在我的机器上已经跑出了上面MyoomTest的内存溢出hprof文件。现在截取在MAT中的一个片段进行分析。 
上面出现的Person包含一个int类型的age,一个Sting类型的name,和一个double类型的height.其中的对象头占用12B,int类型占用4B,double 类型占用8B,String类型默认占用8B所以一个person占用的内存是32B,所以shallow heap的大小是32B。现在分析Java.lang.Object[160065]的shallow  heap的大小,数组中一共有160066个person,但是数组中的每一个只保存了一个大小为4B的地址值,所以620280/4=160070,160070-160066=4;剩下的4个是数组头的开销。
retained heap是指对象自己本身的shallow heap的大小加上对象所引用的对象的大小。换句话说retained heap的大小是指该对象被回收时垃圾回收器应该回收的内存的大小。
垃圾回收器在回收垃圾是不仅回收该对象还要回收该对象所引用的对象。为了更好地而理解retained heap我们来看看下面的例子:下图中的节点代表着对象,带有箭头的边代表着对引用关系。 

图中用蓝色标记的对象表示直接或间接被obj1所引用的对象。图1中我们看到obj3并没有标记成蓝色因为它是被Gc Root直接引用的。图2中的obj3未被Gc Root直接引用所以被标记成蓝色。因此obj1的retained heap的大小在figure1中指的是:
Obj1+ Obj2+Obj3;在figure2中指的是:Obj1+ Obj2+ Obj3+ Obj4;
现在来分析Java.lang.Object[160065]的retained heap的大小在垃圾回收器回收时回收的大小为Java.lang.Object[160065]的shallow heap的大小加上160066个person的shallow heap的大小:620280+32*160066=5742392B与上面的5762360B相差不大,因为还有可能其他地方会占用一些内存。

 

转载自:https://blog.csdn.net/u013309870/article/details/52038407

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值