美文网首页JVM
shallow heap和retained heap的区别

shallow heap和retained heap的区别

作者: sunpy | 来源:发表于2018-06-12 11:24 被阅读20次

    shallow heap的概念

    实际上就是创建的对象实际占用了堆的大小。

    retained heap的概念

    就是这个创建的对象被GC回收掉,能释放多少内存。

    注意

    在jvm中是否回收对象,主要是判断这个对象是否存在引用。如果对象没有被引用,那么将被回收了。

    retained heap的例子

    class Q1 {
        private Q2 q2;
        private Q3 q3;
        private Q4 q4;
    }
    
    class Q2 {
        private Q3 q3;
    }
    
    class Q3 {
        private Q4 q4;
    }
    
    class Q4 {
        private Q5 q5;
    }
    
    class Q5 {
        
    }
    

    对象引用图:


    QQ截图20180611230258.jpg

    假设每个对象都是1K,那么每个对象被GC回收,释放内存分析:
    Q5类的对象的retained heap值为:1K;因为Q5没有引用任何对象,直接被GC掉。
    Q4类的对象的retained heap值为:2K;因为Q4引用Q5,Q4被回收,那么Q5也将被回收。
    Q3类的对象的retained heap值为:1K;因为Q3虽然引用Q4,GC回收Q3之后,Q4还被Q1引用。
    Q2类的对象的retained heap值为:1K;和Q3是同一种情况,虽然Q2引用Q3,但是Q2被GC,但是Q3还是会被Q1引用。
    Q1类的对象的retained heap值为:5K;因为Q1被GC,那么Q2也将被GC,同时Q3也将被GC,Q4也将被GC,Q5也是被GC了。

    shallow heap例子

    计算公式:类定义引用大小 + 父类的成员变量所占的空间 + 当前类的成员变量所占的空间 + 结构体对齐 (结构体对齐满足8的倍数)

    public class Q1 extends Q2{
    
        private boolean isExist;
        private List<String> list;
        
    }
    
    class Q2 {
        private int i;
        private String a;
        
    }
    

    解释:
    Q2的shallow heap大小:类定义引用本身8个字节+当前类的成员变量8个字节(int类型4个字节+String类型4个字节)+结构体对齐0个字节。
    Q1的shallow heap大小:类定义引用本身8个字节+父类的成员变量占8个字节+当前类的成员变量占5个字节(boolean类型1个字节+List类型4个字节)+结构体对齐3个字节。


    参考:
    https://my.oschina.net/freelili/blog/1558406

    http://help.eclipse.org/mars/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Fconcepts%2Fshallowretainedheap.html

    http://ju.outofmemory.cn/entry/206800

    相关文章

      网友评论

        本文标题:shallow heap和retained heap的区别

        本文链接:https://www.haomeiwen.com/subject/coskeftx.html