美文网首页
讲一下 Shallow Size、Retained Size、H

讲一下 Shallow Size、Retained Size、H

作者: Little丶Jerry | 来源:发表于2020-06-01 21:53 被阅读0次

    原文来自 问:讲一下 Shallow Size、Retained Size、Heap Size 和 Allocated

    一、Shallow Size

    Shallow size 就是对象本身占用内存的大小,不包含其引用的对象。

    常规对象(非数组)的 Shallow size 由其成员变量的数量和类型决定。

    数组的 shallow size 由数组元素的类型(对象类型、基本类型)和数组长度决定。

    在 32 位系统上,对象头占用 8 字节。int 占用 4 字节,不管成员变量(对象或数组)是否引用了其他对象(实例)或者赋值为 null 它始终占用 4 字节。

    故此,对于 String 对象实例来说,它有三个 int 成员(3 * 4 = 12 字节)、一个 char[] 成员(1 * 4 = 4 字节)以及一个对象头(8 字节),总共 3 * 4 + 1 * 4 + 8 = 24 字节。

    根据这一原则,对 String mStr = ”rosen jiang” 来说,实例 mStr 的 shallow size 也是 24 字节。(注意 JDK 版本区别):

    public final class String implements java.io.Serializable, Comparable<String>, CharSequence { 
      /** The value is used for character storage. */  
      private final char value[];    
      /** The offset is the first index of the storage that is used. */  
      private final int offset;   
      /** The count is the number of characters in the String. */  
      private final int count;   
      /** Cache the hash code for the string */ 
      private int hash; // Default to 0  
      .....
    }
    

    二、Retained Size

    对象的 Retained Size = 对象本身的 Shallow Size + 对象能直接或间接访问到的对象的 Shallow Size。也就是说,Retained Size 就是该对象被 Gc 之后所能回收内存的总和。

    为了更好地理解 Retained Size,看下图对象的引用对象可以归纳为:该对象到其他对象有引用关系并且该引用对象到 Gc Root 节点是不可达的,所以有:

    左图 obj1 的 Retained Size = obj1 + obj2 + obj4 的 Shallow size

    右图 obj1 的 Retained Size = obj1 + obj2 + obj4 +obj3 的 Shallow size

    总之,Retained size 是一个整体度量,能反映内存结构和对象图的依赖关系,还可以找到根节点。

    image

    在进行垃圾回收时,如果实例对象到 Gc Root 是不可达的,那么该对象会被回收,如下图的 Object F 和 Object I。

    image

    三、Heap Size

    堆的大小,当资源增加,当前堆的空间不够时,系统会增加堆的大小,若超过上限(如 64M,阈值视平台而定)则会被杀掉 。

    四、Allocated

    堆中已分配的大小,即 App 应用实际占用的内存大小,资源回收后,此项数据会变小。

    建议:若单一操作反复进行,堆大小一直增加,则有内存泄露的隐患,可采用 MAT 进一步查看。

    相关文章

      网友评论

          本文标题:讲一下 Shallow Size、Retained Size、H

          本文链接:https://www.haomeiwen.com/subject/ygdezhtx.html