JVM - shallow heap及retained heap

在理解这两个概念以前,要先理解一个概念:GCRoot,jvm的垃圾回收是通过可达性分析来判断对象是否可回收的,主要原理是,以GCRoots作为起点向下搜索,当一个对象到GC Roots没有任何引用链相连,则证明此对象是不可达的。
而GCRoots的主要来源是:

  • 虚拟机栈(栈帧中的局部变量表,Local Variable Table)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象

了解了这个概念,就可以来说shallow heap和retained heap了
shallow heap:对象本身的大小,不包含他依赖的其他对象的大小

表示对象本身占用内存的大小,也就是对象头加成员变量(不是成员变量的值)的总和。
如一个引用占用32或64bit,一个integer占4bytes,Long占8bytes等。

所以,当一个对象如下

public class Dog{
    public int[] dogInt = new int[2048000000];
}

retained heap
如果一个对象被释放掉,那会因为该对象的释放而减少引用进而被释放的所有的对象(包括被递归释放的)所占用的heap大小,即对象被垃圾回收器回收后能被GC从内存中移除的所有对象之和。相对于shallow heap,Retained heap可以更精确的反映一个对象实际占用的大小(若该对象释放,retained heap都可以被释放)。

则它的浅层尺寸(shallow heap)为4(int数组对象的引用) + 8(64为虚拟机的对象头为8字节)字节,retained heap则为4(int数组对象的引用) + 8(64为虚拟机的对象头为8字节) + 2048000000 + 8字节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值