Shallow Size和Retained Size详解

Shallow Size和Retained Size详解

参考文章
How much memory do I need (part 1) – What is retained heap?

How much memory do I need (part 2) – What is shallow heap?

在Android开发中, 想要进行内存分析, 总会看见Shallow SizeRetained Size, 这边文章主要解释

  1. 它们分别表示什么含义
  2. 它们是如何计算出来的

Java garbage collection (GC)

我们先了解GC的一些基本知识

  1. 程序中存在一些实例, 称作GC root, 它们不会被GC回收, 常见的例如静态变量, 线程等
  2. GC root直接或间接引用的实例会被标记为in use, 它们也不会被GC回收

Shallow Size

Shallow Size是指实例自身占用的内存, 可以理解为保存该'数据结构'需要多少内存, 注意不包括它引用的其他实例

计算公式:

Shallow Size = [类定义] + 父类fields所占空间 + 自身fields所占空间 + [alignment]
  1. 类定义是指, 声明一个类本身所需的空间, 固定为8byte, 也就是说, 一个不包含任何fields的类的'空类', 也需要占8byte; 另外类定义空间不会重复计算, 就是说, 即使类继承其他类, 也只算8byte
  2. 父类fields所占空间, 对于继承了其他类的类来说, 父类声明的fields显然需要占用一定的空间
  3. 自身fields所占空间, 所有fields所占空间之和; fields分基本类型和引用, 基本类型所占空间和系统有关, 例如在32位系统中int=4byte, 64位系统中int=8byte; 引用固定占4byte, 例如String name;这个变量声明占4byte.
  4. alignment是指位数对齐, 会让总空间为8的倍数, 例如某个A类, 以上3项计算出来为15byte, 那么为了对齐, 让它是8的倍数, 会取最接近的值, 所以它的Shallow Size是16byte;

注意, alignment行为和JVM有关, 对于Android来说, 实测4.4系统会有对齐行为, 但是5.1系统不会

Shallow Size例子

class X {
    int a;
    byte b;
    Integer c = new Integer();
}

假设当前是在32位系统, 对于类X来说, 一个X实例的Shallow Size为:

  1. 类定义的8byte
  2. 没有继承其他类, 所以没有父类fields
  3. a变量为int型, 4byte; b变量为byte型, 1byte; c变量是引用类型, 和它是否指向具体实例无关, 固定占4byte

如果不算alignment,

X的Shallow Size = 8 + 0 + 4 + 1 + 4 = 17byte

如果算上alignment, 那么要补齐为8的倍数, 也就是24byte.

class Y extends X {
    List d;
    Date e;
}

一个Y实例的Shallow Size为:

  1. 类定义的8byte
  2. 继承了X类, X类的所有fields为X类的Shallow Size减去类定义空间8byte, 也就是17byte-8byte=9byte
  3. d, e都是引用类型, 各占4byte

如果不算alignment,

Y的Shallow Size = 8 + 9 + 4 + 4 = 25byte

如果算上alignment, 那么要补齐为8的倍数, 也就是32byte.

Retained Size

实例A的Retained Size是指, 当实例A被回收时, 可以同时被回收的实例的Shallow Size之和

所以进行内存分析时, 我们应该重点关注Retained Size较大的实例; 或者可以通过Retained Size判断出某A实例内部使用的实例是否被其他实例引用.
例如在Android中, 如果某个Bitmap实例的Retained Size很小, 证明它内部的byte数组被复用了, 有另一个Bitmap实例指向了同一个byte数组.

Retained Size例子

RetainedSize例子.png

图中A, B, C, D四个实例, 为了方便计算, 我们假设所有实例的Shallow Size都是1kb

D实例

D实例没有引用其他实例, 所以移除D实例只会释放它自己的空间, 因此

D实例的Retained Size=Shallow Size=1kb

C实例

当我们移除C实例, C实例引用了D实例, 同时D实例没有被其他实例引用, 所以D实例也会被GC, 所以

C实例的Retained Size = C实例的Shallow Size + D实例的Shallow Size = 2kb

B实例

当我们移除B实例, 虽然B实例引用了C实例, 但是A实例也引用了C实例, 所以移除B实例不会让C实例被GC, 所以

B实例的Retained Size=Shallow Size=1kb

A实例

当我们移除A实例, 显然A, B, C, D实例都会被GC, 所以

A实例的Retained Size=4kb

总结

计算Retained Size的关键在于领会移除实例时, 可以同时被回收的实例, 重点观察B实例的情况

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容