dumpsys meminfo 中的 Lost RAM 怎样计算?
dumpsys meminfo 中的 Lost RAM 是一个比较特殊的指标,它代表了系统无法明确归类到特定用途的内存
帮你先有个整体印象:
内存组成部分 | 说明 |
---|---|
Total RAM | 系统总可用物理内存大小 |
totalPss | 所有进程实际使用的物理内存总和 (PSS) |
totalSwapPss | 所有进程swap占用空间总和 |
Free RAM | 系统当前未使用的内存,包含 cached pss, cached kernel 和 free |
Cached Size | 系统缓存的内存大小 |
Kernel Used | 内核态使用的内存 |
ZRAM Total | ZRAM交换空间总大小 |
🔢 计算公式解析
Lost RAM = Total RAM - (totalPss - totalSwapPss) - Free RAM - Cached Size - Kernel Used - ZRAM Total
这个公式可以理解为:从总物理内存中,减去所有已明确统计的内存部分(进程使用、缓存、内核使用等),剩下的“说不清去哪了”的内存就被归为 Lost RAM
。(大部分是kernel部分占用的计算)
💡 深入理解 Lost RAM
Lost RAM
的出现并不一定意味着内存泄漏。
-
统计口径差异:
dumpsys meminfo
的统计方式可能无法完全覆盖所有内存分配,特别是内核层一些专有驱动或模块的内存使用。例如,某些芯片供应商的 ION 内存(常用于多媒体处理)若未映射到用户进程,就可能未被计入cached
而成为Lost RAM
的一部分。图形系统(如 KGSL)分配的内存也可能贡献Lost RAM
。 -
缓存机制:为了提高分配效率,系统(如 ION)可能会将部分已使用过的内存缓存起来,这些内存在内存紧张时可被释放,但在统计时可能被算作
Lost RAM
。 -
“负值”现象:有时公式计算出的
Lost RAM
会是负数,这通常表明某些内存被重复计算了。
对于MTK 平台来讲是有工具可以对其统计 -- 抓取对应page owner来查看 page_owner_full.txt
有对应的堆栈信息进而分析
Linux 内核的 Page Owner 机制,它确实是深入排查内核层“内存黑洞”和专有驱动内存占用的利器
。
特性 | 说明 |
---|---|
核心功能 | 追踪每个内存页面的分配者,记录调用栈信息 |
主要用途 | 调试内存泄漏、分析内存占用,特别是“内存黑洞” |
记录信息 | 分配时的调用栈、页面顺序、GFP标志等 |
启用方式 | 内核配置 CONFIG_PAGE_OWNER=y ,并在内核启动参数中添加 page_owner=on |
数据接口 | 通过 /sys/kernel/debug/page_owner 获取原始数据 |
分析工具 | 使用 page_owner_sort 等用户空间工具解析和排序数据 |
开启 Page Owner
Page Owner 默认是关闭的,需要手动开启,主要包括内核编译时和系统启动时两个步骤:
- 内核配置:确保内核编译时开启了
CONFIG_DEBUG_FS
和CONFIG_PAGE_OWNER
选项。 - 启动参数:在系统的启动命令行(boot cmdline)中添加
page_owner=on
。你可以通过adb shell "cat /proc/cmdline"
命令检查当前内核是否已启用 Page Owner。
使用 Page Owner 时需要注意以下几点:
- 性能开销:开启 Page Owner 会带来一定的内存和性能开销,因为它需要为每个页面存储额外的元信息(主要是调用栈)。不建议在生产环境长期开启,主要用于调试。
- 早期内存分配:在内核初始化早期、Page Owner 机制尚未完全启动前分配的内存,可能无法被准确追踪。
- 分析复杂度:工具输出的调用栈信息需要一定的内核知识来解读,以理解其对应的内核模块或功能。
当然,MTK平台也有对应工具来抓取开机内存信息--可以来查看Used RAM + Free RAM占用 + 预留内存占用(HW Reserved + Kernel Reserved)信息