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个字节。
网友评论