搜索

首页  >  问答  >  正文

android - java中使用MAT是shallow size 单位是什么

java中shallow size 单位是什么

伊谢尔伦伊谢尔伦2802 天前894

全部回复(1)我来回复

  • 天蓬老师

    天蓬老师2017-04-18 10:51:59

    想要说清楚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个部分组成:

    1. 对象头
      对象头又包含两部分数据;
      一:运行时数据。 32位JVM为32位即4byte.64位为8byte.
      二:类型指针。

    2. 实例数据
      即存放实例变量的数据,变量类型包括两种 基本类型变量和引用变量。
      基本类型变量所占据的字节大小就不说了,引用变量我们存放的是指针。

    3. 填充数据
      对象存储空间为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!

    如有错误,请看客指证。

    回复
    0
  • 取消回复