您的位置:首页 > 移动开发 > Android开发

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

2017-07-18 18:41 609 查看
Overview of Android Memory Management

重点概括:

Android是采用paging和mmapping管理的内存
代码文件(.odex)、资源文件(zipalign后的resource)采用mmapping 将文件以page为单位 映射到内存。在必要的时候(如切换APP、内存不足)可以page out到硬盘上
多个进程可以用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:

目标:

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

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

Sharing Memory(共享内存)

每个app进程都从Zygote fork出来,zygote 系统启动时开启,加载框架code和resource(activity theme)。使FrameWork在RAM pages中大部分的code和resource 可以被所有的app进程共享
大部分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)。
在很多地方,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内存)

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

Switching apps

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

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 内存管理