Android | 内存指标与分析方法
这篇文章的内容会涉及以下前置 / 相关知识,贴心的我都帮你准备好了,请享用~
这篇文章偏底层,难免有写错的地方还请你多多斧正哦~
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 内存分析命令》 ,已经写得非常详细了。