《高性能Andorid开发》笔记 -- 内存性能

1. Android内存:如何工作

  • 共享内存&私有内存

    Zygote共享内存:公共框架类、资源以及本地类库(节省内存)。App启动时,fork一个Zygote进程,这样App初始化就快多了。

  • 脏内存和干净内存

    脏内存:仅存在于RAM(Dalvik运行时编译)
    干净内存:存在于RAM和磁盘上(ART安装时编译)

  • 垃圾回收

    Gingerbread之前:stop-world
    Gingerbread: 布局回收
    KitKat及其之前:标记回收(内存碎片)
    KitKat之后:移动复制

  • 确定应用使用的内存大小
    adb shell dumpsys meminfo
    dump出来的是pss数据,什么是pss呢?参考解释如下:
    VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
    RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
    PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
    USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

  • procstats 了解程序在后台一段时间的内存使用量
    路径:设置-开发者选项-进程统计
    adb shell dumpsys procstats

  • 内存警告
    onTrimMemory有以下警告:

    TRIM_MEMORY_RUNNING_MODERATE
    首先发出 TRIM_MEMORY_RUNNING_MODERATE 警告。
    TRIM_MEMORY_RUNNING_LOW
    如果继续执行,将会发出 TRIM_MEMORY_RUNNING_LOW 警告,就像是黄灯警示。这时系统会开始释放资源 4 来提高系统性能。
    TRIM_MEMORY_RUNNING_CRITICAL
    如果仍然继续执行并且没有释放资源,将会发出红灯警。此时,系统会结束后台进程以获取更多的内存。同时,这将降低 App 的性能。
    TRIM_MEMORY_UI_HIDDEN
    当回调 TRIM_MEMORY_UI_HIDDEN 时,App 刚从前台转为后台,这是释放大量 UI 资源的大好时机。此时 App 在缓存的 App 列表中。如果有问题,此 App 的进程将会被结束。作为一个后台程序,尽可能多地释放资源,这样的恢复会比纯粹的重启 5 更加快速。其中有 3 个级别:
    TRIM_MEMORY_BACKGROUND
    TRIM_MEMORY_MODERATE
    TRIM_MEMORY_COMPLETE

2. 内存泄露

3. 追踪内存泄露工具

  • Heap Dump:查看什么类型数据被分配到内存中
  • Allocation Tracker:查看具体方法时分配了什么对象
  • MAT和LeakCanary: