探讨Android内存管理

本文探讨了Android内存管理机制,包括内存管理概述、如何评估App内存占用、内存分配及图形内存。文章介绍了如何计算内存,如Java、Native、Heap和Graphics的内存使用,并讨论了如何处理内存泄漏和理解OutOfMemoryError,提供了优化建议和监控方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在看这篇文章之前,需要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

图片

  1. Used Pages: 这些是进程当前正在使用的页面.
  2. Cached Pages: 进程正在使用的页面,但是内存的某些部分也存在于主内存中。因此,为了快速检索数据,我们使用缓存的页面,是可以被回收的。
  3. **Free Pages:**空闲页

下面看看内存压力对设备的影响。显示了一段时间内的内存使用情况,当 Cached Pages 低于 LMK 阈值时,将会触发低内存杀死机制。

图片

所以,你可以想象 LMK 在低内存手机上的情景:

图片

Linux Kernel 将会持续跟踪每个进程使用的页(Pages),所以只要对进程使用的 Pages 进行统计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值