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是采用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之Fragment(官网资料翻译)
- (转)android之Fragment(官网资料翻译)
- android之Fragment(官网资料翻译)
- android之Fragment(官网资料翻译)
- android之Fragment(官网资料翻译)
- android之Fragment(官网资料翻译) <Not Found!>
- android测试工具MonkeyRunner--google官网翻译
- Android之Fragment(官网资料翻译)
- android之Fragment(官网资料翻译)
- Android MediaCodec[官网翻译]
- Android官网恢复(重新创建)Activity文档翻译:Recreating an Activity
- android 测试Activity,Content Provider,Service,测试些什么?(摘取自官网,个人翻译…欢迎校正)
- android之Fragment(官网资料翻译)
- android之Fragment(官网资料翻译)
- android之Fragment(官网资料翻译)
- 开发测试篇-android测试-介绍(翻译自android training官网)
- [Android]官网《Testing Support Library》中文翻译
- android 之Fragment(官网资料翻译)
- android 测试Activity,Content Provider,Service,测试些什么?(摘取自官网,个人翻译…欢迎校正)
- 『转』android官网翻译好的蓝牙API接口说明