《移动App性能评测与优化》读后感—内存篇

名词解释

  • VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
  • RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
  • PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
  • USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

Android 应用的内存组成

  1. Dalvik 虚拟机代码 -- 共享内存
  2. 应用框架代码 -- 共享内存
  3. 应用框架资源-- 共享内存
  4. 应用框架 so 库 -- 共享内存
  5. 应用的代码 -- 私有内存
  6. 应用的资源-- 私有内存
  7. 应用的 so 库 -- 私有内存
  8. 堆内存,其他部分 -- 共享/私有

内存组成索引

  • Native Heap: Native 代码分配的内存, 虚拟机和 Android 框架本身也会分配
  • Dalvik Heap: Java 代码分配的对象
  • Dalvik Other: 类的数据结构和索引
  • so mmap: Native 代码和常量
  • dex mmap: Java 代码和常量

Dalvik 内存组成

  • Dalvik-Heap 所有的 Java 实例
  • Dalvik-Other 存放类的数据结构及关系
    • LinearAlloc 载入类的函数信息, 随 dex 中函数数量的增加而增加(65535)
    • Code-Cache jit 编译代码后的缓存,随代码负责度的增大而增大
    • Accounting 用于标记和指针
    • dalvik-aux-structure 随类及方法数的增大而增大
    • dalvik-bitmap 随 dalvik-heap 的增大而增大

mmap

映射 classes.dex 文件。Dalvik 迅疾需要从 dex 文件中加载类信息、字符串常量等, 还需要在调用函数的时候直接从 mmap 内存中读取函数代码(dvm bytecode)执行; 所以该部分内存是程序运行必不可少的。
应用的 dex 会占据较大的空间, 并且随着代码增加, dex 文件变大, 占用的内存也会增加。

zygote 共享内存机制

Dalvik Pss = 私有内存(Private Dirty) + (共享内存 Shared Dirty / 共享进程数)

一个类的内存消耗

Foo f = new Foo();

一、 loadClass 操作,将类信息从 dex 文件加载进内存:

  1. 读取 .dex mmap 中 class 对应的数据
  2. 分配 native-heap 和 dalvik-heap 内存创建 class 对象
  3. 分配 dalvik-LinearAlloc 存放 class 数据
  4. 分配 dalvik-aux-structure 存放 class 数据

二、 new instance 操作, 创建对象实例:

  1. 执行 .dex mmap 中 <clinit> 和 <init> 代码
  2. 分配 dalvik-heap 创建 class 对象实例

在这个过程中,可能还会分配 dalvik-bitmap 和 jit-code-cache 内存。 如果 class Foo 引用了其他类, 继续按照同样的逻辑创建被引用的 class。

优化策略

Heap 优化

注意内存碎片

  • 尽量不要在循环中创建很多临时变量
  • 可以将大型的循环拆散、分段或按需执行

原因:内存分配的最小单位是页面, 通常为 4KB。

  1. 运行过程中生成很多临时变量
  2. 批量生成过程中, 由于还有空闲内存,虚拟机没有做垃圾回收
  3. 完成后进行垃圾回收, 清楚所有的临时变量,留下内存碎片。

因为 DVM 没有内存整理功能,可能一整页的内存被使用的只有很小一部分, 但是计算私有内存还是按照整页 4KB 计算。

Dalvik Other 优化

dex 文件中数据基本是按类名的字母顺序排列的, 这样同包名的类会排在一起。实际执行过程中, 同一个 package 下的类并不会全部同时被调用, 而是和很多其他的 package 下的类进行交互。 mmap 加载了整个页面, 其中可能很多是无用数据。可以通过混淆把互相调用的类改为同一个 package。

精简代码, 无用的代码随时清除。 并不是不运行就不会占用内存了。

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

推荐阅读更多精彩内容