内存管理-31-系统内存统计-6-dumpsys meminfo-3-chatGPT
一、dumpsys meminfo 的"Free RAM"字段的大小能代表系统物理内存的紧张程度吗?若物理内存极度紧张,这个值会持续变小吗?
结论: 不能单独代表。 Android 16 的 dumpsys meminfo 里,“Free RAM”是 framework 拼出来的一个“空闲 + 可回收”估算值:#### Free RAM = cachedPss + cached kernel + MemFree
其中通常大部分是缓存和可回收内存,真正完全空闲的只有最后一项。物理内存极度紧张时,这个值总体可能下降,但不会持续单调变小。 它会受回收、zram 换出、进程状态变化和 LMKD 杀进程影响,可能平台化、波动,甚至在高压力下仍然保持不小的数值。因此不能用它的绝对大小或下降趋势来判断系统有多紧张。
1. Android 16 中 Free RAM 的确切构成
源码位置:
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:13111 frameworks/base/core/java/com/android/internal/util/MemInfoReader.java:101
1.1 打印逻辑
pw.print("Total RAM: "); pw.print(stringifyKBSize(memInfo.getTotalSizeKb())); pw.print(" (status "); mAppProfiler.dumpLastMemoryLevelLocked(pw); pw.print(" Free RAM: "); pw.print(stringifyKBSize(cachedPss + memInfo.getCachedSizeKb() + memInfo.getFreeSizeKb())); pw.print(" (");pw.print(stringifyKBSize(cachedPss)); pw.print(" cached pss + "); pw.print(stringifyKBSize(memInfo.getCachedSizeKb())); pw.print(" cached kernel + "); pw.print(stringifyKBSize(memInfo.getFreeSizeKb())); pw.println(" free)");
所以:Free RAM = cachedPss + cached kernel + free
2. 三个分量的来源
------------------------------------------------------------------------------------------------------------------------------------------------ 分量 实际内容 数据来源 ------------------------------------------------------------------------------------------------------------------------------------------------ cached pss oomAdj ≥ CACHED_APP_MIN_ADJ 的缓存进程的 PSS 之和 遍历进程 Debug.MemoryInfo 累加,见 ActivityManagerService.java cached kernel Buffers + KReclaimable + Cached - Mapped + SwapCached /proc/meminfo,见 MemInfoReader.java free MemFree /proc/meminfo ------------------------------------------------------------------------------------------------------------------------------------------------
典型输出:
Total RAM: 11,500,000K (status normal) Free RAM: 4,000,000K (800,000K cached pss + 2,900,000K cached kernel + 300,000K free)
这 4GB 里只有 300MB 是真正空闲的 MemFree,其余 3.7GB 是“理论上可以回收”的内存,不等于随时可用的物理内存。
3. 不能代表物理内存紧张程度的原因
3.1 cached pss 不是空闲内存
缓存进程的 PSS 仍实实在在地占用物理页。它只有在以下情况才会释放:
(1) 进程被 LMKD 杀死;
(2) 系统执行内存 trim;
(3) 它的文件页被内核回收;
(4) 它的匿名页被换出到 zram。
在进程被回收之前,这部分内存一边占用 RAM,一边被计入 “Free RAM”。
3.2 cached kernel 也不等于可分配内存
Cached 是页缓存,KReclaimable 包含可回收 slab 以及 ION/DMA-BUF heap pool。AOSP 注释说:
ION/DMA-BUF heap pools are reclaimable and hence, they are included as part of memInfo.getCachedSizeKb().
但这些 pool 是特定 heap/驱动的缓存池,不等于任意进程都能立即使用的空闲页。在这颗 8295 A16 上此前的分析里,KReclaimable 的大头正是 dma-buf/KGSL 空闲页池,Mapped 也受 KGSL 直插页影响。这会进一步让 “Free RAM” 偏大或构成失真。
3.3 进程前后台切换就能改变它
cachedPss 只统计 cached 进程:一个应用从前台退到后台,它的 PSS 会进入 cached pss,Free RAM 变大;一个应用从后台回到前台,它的 PSS 不再计入 cached pss,Free RAM 变小。
这个过程中物理内存可能几乎没变,只是统计口径变了。因此 Free RAM 会随用户操作和应用生命周期跳动。
3.4 “status” 也不是物理内存压力
Total RAM: ... (status normal/low/critical) 来自 mLastMemoryLevel:有 lowmem detector 时,取 mLowMemDetector.getMemFactor();没有时,按 cached/empty 进程数量估算。
源码见 AppProfiler.java 。它更接近“后台进程保留程度”,不是 PSI 那样的实时分配压力。
3.5 压力是动态量,Free RAM 是存量估算
内存紧张的本质是:
(1) 分配时是否需要 direct reclaim;
(2) 是否发生 thrashing;
(3) 是否频繁 refault;
(4) swap/zram 是否接近耗尽;
(5) 是否已经触发 LMKD kill。
这些都不是 “cached pss + cached kernel + MemFree” 能表达的。
4. 极度紧张时,Free RAM会持续变小吗?
不会持续单调变小。 分几种情况看。
4.1 前台匿名内存持续分配
前台进程分配匿名页:MemFree 下降;前台进程的 PSS 不在 cachedPss 里;Free RAM 随之下降。这是 Free RAM 真正会下降的主要场景。
4.2 文件页被回收
内核回收页缓存:Cached 下降 → MemFree 上升, Cached 和 MemFree 都在 Free RAM 里,所以总量大致不变,只是从左口袋搬到右口袋。
4.3 匿名页换出到 zram
进程 PSS 下降(匿名页不再驻留), zram 压缩数据占用物理页增加。
cachedPss 下降,但 zram 占用的物理内存不在 cachedPss / cached kernel / MemFree 三项里(应该说体积变小了吧),所以 Free RAM 反而会下降。这也是为什么开启 zram 后,Free RAM 不能简单理解为“系统更宽裕了”。
4.4 LMKD 杀死 cached 进程
看起来应该释放很多内存,但 Free RAM 不会明显回升,原因是:
(1) 被杀进程的 PSS 原本就计入 cached pss;
(2) 私有匿名页释放后变成 MemFree,大致抵消 cachedPss 的减少;
(3) 私有文件页可能留在页缓存里,从 cachedPss 转入 cached kernel,也大致抵消;
(4) 共享页的 PSS 份额消失,但物理页仍被其他进程映射,没有等量释放。
所以杀 cached 进程后,Free RAM 可能基本不变,甚至因共享 PSS 消失而略降。只有杀掉原本不在 cachedPss 里的进程(如 perceptible 进程),Free RAM 才会明显上升。
4.5 MemFree 会被水位托底
内核不会让 MemFree 自由跌到 0。低于水位后会先触发 kswapd/direct reclaim,再触发 LMKD kill 或 OOM。因此:MemFree 很小,但通常不会长期为接近 0。而 cachedPss 和 cached kernel 只要进程还在、缓存还在,就仍然计入 Free RAM。结果是 Free RAM 可能维持在一个“看起来还行”的水平,但系统已经在 direct reclaim 或频繁 kill。
5. 实际判读建议
------------------------------------------------------------------------------------------------------------------ 现象 含义 ------------------------------------------------------------------------------------------------------------------ Free RAM 低,PSI 低 缓存少,但分配顺畅,不一定紧张 Free RAM 高,PSI 高 内存可能被不可回收/碎片化内存占住,或 pool 统计偏大 Free RAM 低,PSI full avg10 持续 > 0 真实内存压力 SwapFree 快速下降,zram mem_used_total 快速上升 zram 接近极限,物理内存被压缩数据消耗 pgscan_direct / allocstall 快速增长 已进入直接回收,压力明确 出现 LMKD kill 系统已无法靠回收维持,属于重度压力 ------------------------------------------------------------------------------------------------------------------
6. 结论
(1) 物理内存极度紧张时,Free RAM:
(2) 可能下降,尤其是前台匿名内存增长、zram 换出增多时;
(3) 不会持续单调下降,文件页回收会让它平台化;
(4) 不会降到 0,因为 MemFree 被水位机制托底,且 cached 部分仍被计入;
(5) 可能大幅波动,进程前后台切换、LMKD kill、缓存回收都会改变统计构成;
(6) 可能数值不低但仍然很紧张,特别是 KReclaimable/ION/DMA-BUF pool 较大时。
一句话总结: Free RAM 是一个“缓存 + 空闲”的静态盘点值,适合在相同负载下做粗略趋势对比;判断物理内存是否紧张,应看 PSI、direct reclaim、swap/zram 消耗和 LMKD kill,而不是它的大小或是否“持续变小”。
posted on 2026-10-24 16:07 Hello-World3 阅读(4) 评论(0) 收藏 举报
浙公网安备 33010602011771号