Android meminfo 查看方法及解析

目录

[Android 上查看memory 信息的方法](#Android 上查看memory 信息的方法)

内存限制的信息

手动释放缓存

[adb shell dumpsys meminfo pid 解析](#adb shell dumpsys meminfo pid 解析)

[adb shell dumpsys meminfo 汇总信息说明](#adb shell dumpsys meminfo 汇总信息说明)

[Total RAM](#Total RAM)

[Free RAM](#Free RAM)

ION

[Used RAM](#Used RAM)

[Lost RAM](#Lost RAM)

ZRAM

/proc/meminfo

参考文档


Android 上查看memory 信息的方法

  • adb shell dumpsys meminfo : 查看系统整体和每个进程meminfo。
  • adb shell dumpsys meminfo pid: 查看一个进程的memory占用情况。
  • adb shell; cat /proc/zoneinfo:查看zoneinfo
  • adb shell; cat proc/meminfo : 系统整体memory占用。
  • adb shell procrank: 进程的内存情况, 需要root;
  • showmap pid : 查看指定Pid的内存具体信息。
  • free -m 查看free memory. free只包括没使用的, 不包括cached。

total used free shared buffers

Mem: 11960 11860 99 14 342

-/+ buffers/cache: 11517 442

Swap: 4095 0 4095

  • adb shell top: 只能总的内存和free, 单个进程仅能查看Rss值, 不能看到pss, 一般pss更有意义。

内存限制的信息

查看内存限制。 OOM和cgroup

  • 查看cgroup 内存 sys/fs/cgroup/memory/${cgroup}/memory.limit_in_bytes
  • 查看oom 最小内存 ,该值触发内存回收/proc/sys/vm/min_free_kbytes :该值为全部zone的min free 总和。 但各zone 水线(min low high)查看cat /proc/zoneinfo
  • low memory killer阀值(lmk ) 查看属性sys.lmk.minfree_levels。

手动释放缓存

操作文件:/proc/sys/vm/drop_caches

To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;

to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;

to free pagecache, dentries and inodes, use echo 3 > /proc/sys/vm/drop_caches.

Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first.

adb shell "echo 3 > /proc/sys/vm/drop_caches"

通过 adb shell dumpsys meminfo |grep free 可以看到回收的效果。

adb shell dumpsys meminfo pid 解析

各值之间的关系见图,相同颜色的在等号两边是相当的。

adb shell dumpsys meminfo 汇总信息说明

输出信息处理代码在:dumpApplicationMemoryUsage()@ActivityManagerService.java

实际信息获取代码在: rsystem/memory/libmeminfo/sysmeminfo.cpp

分项说明:

Total RAM

系统总memory size。取自/proc/meminfo/MemTotal

Free RAM

可用内存。

其中 :

  • cached pss : 为ams中所有cached app的size。cached app 为oomAdj大于 CACHED_APP_MIN_ADJ(900)的app, 这部分内存可以在lmkd中内存紧张时会被回收。
  • cached kernel :为/proc/meminfo 中KReclaimable+ Buffers+ Cached -Mapped . 代码见: getCachedSizeKb@frameworks/base/core/java/com/android/internal/util/MemInfoReader.java
  • free:对应/proc/meminfo中的MemFree。

ION

读取的是ion heap值,为文件:"/sys/kernel/ion/total_heaps_kb"中的值。

注: andnroid 11上使用ion机制, android 12上ion 已经被DMA-buf heaps 替代。

其中

  • ION mapped: 读取的是文件/proc/pid/maps中所有以"/dmabuf"开头的行对应的数值总和, 不仅包含ion信息, 同样包含任何其他dma buffer 文件的map信息, 所以该值可能大于ion 的数值。
  • unmapped: 为ion -ion mapped, 当ion mapped > ion时该值为负值。这是ion信息不严谨的地方。

ION 信息同样被统计到了meminfo 的其他项中, mapped+unmapped 统计在了Used RAM中。 pools统计到了 Free RAM中, 估计统计到了cached kernel中, 因为如果使用adb shell "echo 3 > /proc/sys/vm/drop_caches" , pools会清零, 同时 cached kernel 大幅减少, free增加。

Used RAM

为 所有可以统计到的已经使用的memory。

其中:

  • used pss: 为所有process的pss内存总和- cached pss。
  • kernel:为/proc/meminfo 中的 Shmem + SUnreclaim + VmallocUsed + PageTables + KernelStack + ION

Lost RAM

无法统计的使用的RAM信息。 为Total RAM - Free RAM - Used RAM - ZRAM + totalSwapPss(所有进程交换出得内存总和)。 每个进程totalSwapPss 计算参看 getTotalSwappedOutPss()@frameworks/base/core/java/android/os/Debug.java。

ZRAM

获取自: /sys/block/zram/mm_stat or /sys/block/zram/mem_used_total。第三项为zram使用。

swap: 使用的交换区的大小, 取自/proc/meminfo/SwapTotal - SwapFree。 total swap 为 /proc/meminfo/SwapTotal。

Total RAM: 11,650,184K (status normal)

Free RAM: 6,092,133K ( 422,981K cached pss + 136,832K cached kernel + 5,532,320K free)

ION: 749,412K ( 529,816K mapped + 14,220K unmapped + 205,376K pools)

Used RAM: 3,452,774K (1,937,002K used pss + 1,515,772K kernel)

Lost RAM: 2,105,265K

ZRAM: 12K physical used for 0K in swap (4,194,300K total swap)

Tuning: 256 (large 512), oom 322,560K, restore limit 107,520K (high-end-gfx)

/proc/meminfo

推荐博客: Linux:/proc/meminfo参数详细解释-CSDN博客,里面说明的很清楚。

总结如下: 系统内存的使用情况可以用以下公式表示:

|---|---|---|---|---|---|---|---|
| MemTotal = MemFree +【Slab+ VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce + X】+【Active + Inactive + Unevictable + (HugePages_Total * Hugepagesize)】 ||||||||
| MemTotal = MemFree +【Slab+ VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce + X】+【Cached + AnonPages + Buffers + (HugePages_Total * Hugepagesize)】 ||||||||
| MemTotal = MemFree +【Slab+ VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce + X】+【ΣPss + (Cached -- mapped) + Buffers + (HugePages_Total * Hugepagesize)】 ||||||||

参考文档

memAailable : https://www.cnblogs.com/cxj2011/p/17455096.html

meminfo详解: Linux:/proc/meminfo参数详细解释-CSDN博客

linux alloc_pages() GFP标志位说明: Linux中的物理内存管理 [三] - 知乎

相关推荐
sweetying2 小时前
30了,人生按部就班
android·程序员
用户2018792831672 小时前
Binder驱动缓冲区的工作机制答疑
android
真夜2 小时前
关于rngh手势与Slider组件手势与事件冲突解决问题记录
android·javascript·app
用户2018792831672 小时前
浅析Binder通信的三种调用方式
android
用户093 小时前
深入了解 Android 16KB内存页面
android·kotlin
火车叼位4 小时前
Android Studio与命令行Gradle表现不一致问题分析
android
前行的小黑炭6 小时前
【Android】 Context使用不当,存在内存泄漏,语言不生效等等
android·kotlin·app
前行的小黑炭6 小时前
【Android】CoordinatorLayout详解;实现一个交互动画的效果(上滑隐藏,下滑出现);附例子
android·kotlin·app
用户20187928316718 小时前
Android黑夜白天模式切换原理分析
android
芦半山19 小时前
「幽灵调用」背后的真相:一个隐藏多年的Android原生Bug
android