ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Android meminfo 查看方法及解析

Android meminfo 查看方法及解析

目录

Android 上查看memory 信息的方法

内存限制的信息

手动释放缓存

adb shell dumpsys meminfo pid 解析

adb shell dumpsys meminfo 汇总信息说明

Total RAM

 Free RAM

ION

Used 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中的物理内存管理 [三] - 知乎

返回列表