Android | 内存指标与分析方法

 我来答
黑科技1718
2022-07-13 · TA获得超过5897个赞
知道小有建树答主
回答量:433
采纳率:97%
帮助的人:82.7万
展开全部

这篇文章的内容会涉及以下前置 / 相关知识,贴心的我都帮你准备好了,请享用~

这篇文章偏底层,难免有写错的地方还请你多多斧正哦~

Android 系统包括三种不同类型的内存:RAM、zRAM 和 ROM:

对于内核来说,无论是内核进程还是用户进程,说到底都是 task_struct 结构体的一个实例。task_struct 也叫进程描述符(process descriptor),里面记录了进程相关的所有信息。

在 task_struct 中有一个 mm_struct 的数据结构,也叫内存描述符(memory descriptor),里面记录了 Linux 进程内存管理的所有信息。mm_struct 定义在 linux/mm_types.h 头文件中,其中有一个页(page)的数据结构:

—— 图片引用自网络

页(Page)是 Linux 内核进行内存管理的基本单位,通常一个页的大小为 4 KB 。根据页面是否使用分为 “可用页” 和 “已使用页” 两种,其中已使用页可以分为以下类别:

缓存页是指有存储器中的文件支持的内存,分为两种: 私有页 & 共享页

匿名页是没有存储器中的文件支持的内存(例如由设置了 MAP_ANONYMOUS 标志的 mmap() 进行分配)

为了避免应用滥用内存,Android 系统会限制应用可以申请的最大堆内存,超过此限制就会抛出 OOM 异常。Android 设备出厂后,最大堆内存就已经确定,相关的配置位于系统根目录 /system/build.prop 文件中,我们可以通过命令查看:

在 App 虚拟机启动时,会读取 /system/build.prop 文件的配置,源码位于: AndroidRuntime.cpp

需要注意的是,配置 dalvik.vm.heapgrowthlimit 限制的仅仅是 Java 堆内存,本地内存不受其限制的。换句话说,应用可以使用的最大内存其实是可以大于最大堆内存的。

在确定进程占用了多少内存时,必须考虑多个进程共享页的情况。在 Linux 里,一个进程占用的内存有四种指标,分别是:

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS。

—— 图片引用自 https://developer.android.google.cn/topic/performance/memory-management Android Developers

—— 图片引用自 https://www.cnblogs.com/sunsky303/p/13494977.html —— sunsky303 著

关于输出信息的具体分析,建议直接看 Gityuan 的这篇文章: 《Android 内存分析命令》 ,已经写得非常详细了。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式