java retained size_java中使用MAT是shallow size 单位是什么

想要说清楚shallow size就必须要提到Retained Size。

shallow size: 表示自身对象占用的大小。

retained size: 自身对象+引用对象的retained大小。

先借用一张图,这张图更能清楚的表示他们之间的计算关系。

c19dc63c431e175b2710efc66d98e446.png

B的shallow size = B;

B的retained size = B shallow size + C retained size + D retained size;

在举例之前,首先要了解JAVA对象在堆中的存储,我们以32位JVM虚拟机为例:

JAVA对象在堆中共有3个部分组成:

对象头

对象头又包含两部分数据;

一:运行时数据。 32位JVM为32位即4byte.64位为8byte.

二:类型指针。

实例数据

即存放实例变量的数据,变量类型包括两种 基本类型变量和引用变量。

基本类型变量所占据的字节大小就不说了,引用变量我们存放的是指针。

填充数据

对象存储空间为8byte的整数倍,如果对象头+实例数据不足8byte的整数倍,则进行填充。

说到引用类型大小,32位虚拟机下引用占据4byte. 64位虚拟机下如果不开启指针压缩,则引用占据8byte。

下面我们根据例子进行说明:

public class TestObjSize {

private int a = 1;

private boolean b = true;

private TestObjSize testObjSize;

public static void main(String[] args) {

Object object = new Object();

TestObjSize test = new TestObjSize();//这个new出来的对象记为obj1

test.testObjSize = new TestObjSize();//这个new出来的对象记为obj2

System.out.println(object.hashCode());

System.out.println(test.hashCode());

try {

Thread.sleep(3000000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

因为shallow size与实例变量是否有引用无关,所我们先分析下**TestObjSize的shallow size,

shallow size = 4byte(对象头) + 4byte(类型指针) + 4byte(int a) + 1byte(boolean b) + 4byte(TestObjSize引用) = 17;**

17不是8的整数倍所以会有7个byte的填充数据,最终TestObjSize类型的实例对象的shallow size = 24;

根据例子我们看到obj2对象的testObjSize = null,

obj2的retained size = obj2的shallow size = 24;

obj1对象的testObjSize为obj2,所以obj1的retained size = obj1的shallow size + obj2的retained size = 48;

最后附上heapdump!

550084e07b48bc836440a11bfe4b8995.png

如有错误,请看客指证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值