Android官网内存管理概略--翻译

来源:互联网 发布:mysql引擎区别 编辑:程序博客网 时间:2024/06/15 00:18

Overview of Android Memory Management

重点概括:

  1. Android是采用paging和mmapping管理的内存
  2. 代码文件(.odex)、资源文件(zipalign后的resource)采用mmapping 将文件以page为单位 映射到内存。在必要的时候(如切换APP、内存不足)可以page out到硬盘上
  3. 多个进程可以用mmapping 映射一块内存(如ContentProvider、WindowSurface,该memory不在应用进程空间,而在内核管理的page cache中)进行读写,达到IPC(进程间通信)的功能。所以计算Android heap占用的内存 要考虑到共享内存。 PSS(Proportional set size)= unshared memory + (共享memory / 共享该memory的进程数);USS(Unique set size)= unshared memory:RSS(resident set size)= unshared memory + shared memory;VSS:所有可读取地址空间(包括不在RAM的memory,如mallocs分配后没有写的)(RSS和VSS通常价值不大,因为不能精确反应共享内存)

ART和Dalvik虚拟机使用  页式调度(paging)和memory-mapping(mmapping)去管理内存。这意味着一个app的 any memory改变后(通过分配new objects 或 touching mmapped pages)都将停留在RAM中 并且 无法被paged out(换页到硬盘里)。唯一释放内存的方法是 释放被app持有的object引用,使memory可以被GC。有一个例外:任何mmapped的没有更改的文件,例如 代码,可以被RAM paged out,如果系统需要内存处理别的作业。

本文侧重于解释Android如果管理app进程和内存分配。


Garbage collection:

目标:

  1. 找到将来无法被程序读取的 objects 数据
  2. 回收被objects使用的数据

其他的都老生常态就是省略了。。。。。


Sharing Memory(共享内存)

  1. 每个app进程都从Zygote fork出来,zygote 系统启动时开启,加载框架code和resource(activity theme)。使FrameWork在RAM pages中大部分的code和resource 可以被所有的app进程共享
  2. 大部分static data采用 mmapped 到进程内,mmapping允许进程间共享数据,允许必要时 paged out 出RAM。static data有:Dalvik code(放置在 预连接的.ode文件将直接mmapping),app resources(需要机构化resource table使其可以被 mmapped,需要对齐apk中的zip实体,也就是要zipalign app),和传统的项目元素(如.so文件中的native code)。
  3. 在很多地方,Android通过显式的分配共享内存区域(ashmem或gralloc) 来跨进程共享 相同的动态RAM。例如:window surfaces在app和screen compositor之间共享内存,cursor buffer在content provider和client之间共享内存。

因大量使用share memory,在确定app使用多少memory时要留心。测量RAM的方法


Allocating and Reclaiming App Memory(分配回收App内存)

app进程的Dalvik heap被限制在 single virtual memory range(单独一块的虚拟内存范围内),heap size可以增加,但是系统定义了上限。

heap使用的虚拟内存 不等于 使用的物理内存大小。当监测 APP的heap时,Android统计一个数值被称为Proportional Set Size(PSS),PSS包含与其他进程共享的 dirty and clean pages,但共享内存只统计 一个app所占RAM比例的大小(如:3个app共享15个pages,则PSS中共享内存为5个pages)。系统认为PSS是物理内存的footprint(印记,也就是消耗了,像碳排放印记)。

Dalvik不压缩logical heap size,也就是Android不会对heap进行碎片整理以关闭空间。Android只可以缩小logical heap size,当heap的末尾有不使用的空间。

然而系统仍旧可以减少 heap使用的physical memory size。在GC后,Dalvik将未使用的pages返回给内核(使用系统调用madvise)。

Restricting App Memory(限制App内存)

  1. 限制由手机RAM总量决定,到达上限将会 OOM。
  2. 查询app heap可用大小: ActivityManager,getMemoryClass() (返回单位为M,一般是16,大的设备可能是24 或 更高)


Switching apps

1.app被切换掉,进程会缓存到LRU cache中

2.内存不够时,以LRU 和 占用内存大小 为依据来杀进程


原创粉丝点击