探讨Android内存管理
在看这篇文章之前,需要Linux内存管理基础,推荐先学习一些Linux内存管理基础知识点,这里我们在做一些应用层的优化工作,但从底层理解一些原理性的知识点,对我们有较大帮助。
主要讨论四点内容:
Android 内存管理机制 如何评估 App 的内存占用 一些减少 App 内存占用的建议 内存管理概述Android 运行时 (ART) 和 Dalvik 虚拟机使用分页和内存映射来管理内存。这意味着应用修改的任何内存,无论修改的方式是分配新对象还是轻触内存映射的页面,都会一直驻留在 RAM 中,并且无法换出。要从应用中释放内存,只能释放应用保留的对象引用,使内存可供垃圾回收器回收。这种情况有一个例外:对于任何未经修改的内存映射文件(如代码),如果系统想要在其他位置使用其内存,可将其从 RAM 中换出。
分页页是一种内存管理技术,它允许进程的物理内存不连续。它通过在称为页面(Page)的相同大小的块中分配内存来消除碎片问题,是目前比较优秀的内存管理技术。分页将物理内存划分为多个大小相等的块,称为帧(Frame)。并将进程的逻辑内存空间也划分为大小相等的块,称为页面(Page),通过页表(Page Table)用于查找此刻存储特定页面的帧,Android 使用的分页稍有不一样的地方。
内存映射(binder、thread、内存分配、io)内存映射(mmap)是一种内存映射文件的方法,即将一个文件或者其他对象映射到进程的地址空间,实现文件磁盘地址和应用程序进程虚拟地址空间中一段虚拟地址的一一映射关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上。应用程序处理映射部分如同访问主存。
了解Android内存使用情况Android内存管理方式,通常,Android设备的内存分为很多页(Page),每页大约4 KB。
Image source: Google I/O 18
Used Pages: 这些是进程当前正在使用的页面. Cached Pages: 进程正在使用的页面,但是内存的某些部分也存在于主内存中。因此,为了快速检索数据,我们使用缓存的页面,是可以被回收的。 **Free Pages:**空闲页下面看看内存压力对设备的影响。显示了一段时间内的内存使用情况,当 Cached Pages 低于 LMK 阈值时,将会触发低内存杀死机制。
所以,你可以想象 LMK 在低内存手机上的情景:
Linux Kernel 将会持续跟踪每个进程使用的页(Pages),所以只要对进程使用的 Pages 进行统计
有些 Pages 是进程间共享的:
那么问题来了?如何处理此共享内存。是由应用程序负责共享内存,还是由Google Play服务负责此共享内存?有几种不同的方法可用于处理这些情况:
RSS (Resident Set Size): 应用程序负责所有共享内存,使用Google Play服务的应用将负责内存共享。 USS (Unique Shared Set): 应用程序不负责任何共享页面。 **PSS (Proportional Set Size)
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341