android - java中使用MAT是shallow size 单位是什么
问题描述
java中shallow size 单位是什么
问题解答
回答1:想要说清楚shallow size就必须要提到Retained Size。shallow size: 表示自身对象占用的大小。retained size: 自身对象+引用对象的retained大小。
先借用一张图,这张图更能清楚的表示他们之间的计算关系。
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出来的对象记为obj1test.testObjSize = new TestObjSize();//这个new出来的对象记为obj2System.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!
如有错误,请看客指证。
相关文章:
1. MYSQL新建用户设置可以远程访问的问题2. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)3. java - mybatis怎么实现在数据库中有就修改,没有就添加4. $fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题5. node.js - nodejs和前端JavaScript 字符串处理结果不一样是什么原因?6. mysql 为何insert的时候会有lock wait timeout 异常7. mysql - 我的myeclipse一直连显示数据库连接失败,不知道为什么8. mysql 5.7单表300万数据,性能严重下降,如何破?9. mysql同步数据到elasticsearch用什么工具?10. 数据库 - mysql 远程可以连接,但是本地连接拒绝?
![$fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题](http://www.haobala.com/attached/image/news/202205/093622cb60.png)