shallow heap和retained heap的区别

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 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的区别)