Android手机内存监控常用命令及参数解释

  • 一、cat proc/meminfo
  • 二、free -h
  • 三、dumpsys meminfo
  • 四、手机自带的内存管理器查看
  • 四、实时内存查看
  • 分析内存假占满现象


一、cat proc/meminfo

/proc/meminfo 文件包含了和内存占用有关的原始信息。
由于篇幅有限,只显示前几行信息

HNR553T:/ $ cat proc/meminfo
MemTotal:        6291456 kB
MemFree:         2293208 kB
MemAvailable:    3452580 kB
Buffers:            5896 kB
Cached:          1335984 kB
KernelStack:       26848 kB
Mapped:           629552 kB

参数解释
MemTotal表示手机总内存。
MemFree表示系统未使用的内存。(系统层面)
MemAvailable表示可分配给应用程序的内存,分析内存泄漏主要看这个值的变化
Buffers表示给文件的缓冲大小。
Cached表示被高速缓冲存储器使用的大小。
KernelStack(内核栈)是常驻内存的,既不包括在LRU lists里,也不包括在进程的RSS/PSS内存里,所以我们认为它是kernel消耗的内存。KernelStack是给kernel code使用的。
Mapped表示设备和文件等映射的大小。

二、free -h

实际上,free 命令中的信息都来自于 /proc/meminfo 文件

HNR553T:/ $ free -h
                total        used        free      shared     buffers
Mem:             5.1G        2.9G        2.1G        4.5M        5.7M
-/+ buffers/cache:           2.9G        2.1G
Swap:            3.1G           0        3.1G

参数解释
第二行:Mem表示系统物理内存的使用情况
第三行:-/+ buffers/cache表示buffers和cache所用总量的总和(buffers为内核缓冲区所用的内存,cache为页缓存和slabs所用的内存容量)
第四行:Swap表示swap交换内存的使用情况,也就是我们通常所说的虚拟内存。可以看到,可被用作swap的硬盘总大小为3.1G
total:内存总大小
used:系统已使用的内存。这里面的内存虽然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收。
free:系统未使用的内存。(系统层面)
shared:多个进程共享的内存大小,大部分是tmpfs占用(tmpfs 就是内存实现的文件系统比如 /dev/shm)
buffers:待写入磁盘的缓冲
cache:从文件读来的数据的缓存
1、从系统层面的角度来说,free表示真正尚未被使用的物理内存数量。
2、从应用程序的角度来说,可使用的内存available = free + buffer + cache,used包含cache。简单的说,系统当前可使用的内存不只是free里的内存,还需要加上used里可回收的内存。

这里特别讲一下buffers和catche
buffer:磁盘等块设备的缓冲,内存的这一部分是要写入到磁盘里的。在buffer中的数据不是即时写入磁盘,而是系统空闲或者buffer达到一定大小时再统一写到磁盘中。这些数据断电易失,为了防止数据丢失,我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据理科写到磁盘里。
cache:文件系统层级的缓存,从磁盘里读取的内容是存储到这里。这样程序读取磁盘内容就会非常快,比如使用grep和find命令查找内容和文件时,第一次会比较慢,再次执行就快好几倍甚至几十倍。
Linux为了提升读写性能,会消耗一部分内存资源缓存磁盘数据。对于内核来说,buffers和cache其实都属于已经被使用的内存。当应用程序申请内存时,如果free内存不够,内核就会回收buffers和cache的内存来满足应用程序的请求。

与proc/meminfo的对应关系:
total = MemTotal
used = MemTotal - MemFree
free = MemFree
shared =
buffers = Buffers
Swap 对应SwapTotal、SwapFree

三、dumpsys meminfo

HNR553T:/ # dumpsys meminfo
Applications Memory Usage (in Kilobytes):
Uptime: 4539677 Realtime: 4539677

Total RAM: 6,291,456K (status normal)
 Free RAM: 3,253,583K (  164,903K cached pss +   779,452K cached kernel + 2,309,228K free)
      ION:   236,520K (  233,248K mapped +         0K unmapped +     3,272K pools)
 Used RAM: 1,613,199K (1,380,735K used pss +   232,464K kernel)
 Lost RAM: 1,424,670K
     ZRAM:         4K physical used for         0K in swap (3,335,432K total swap)
   Tuning: 256 (large 512), oom   322,560K, restore limit   107,520K (high-end-gfx)

参数解释
由此可知, Free RAM = cached pss + cached kernel + free
cached pss = Total PSS by OOM adjustment:里Cached那一栏的PSS总和

与proc/meminfo的对应关系:
cached kernel = Cached+Buffers-Mapped
Free RAM = MemAvailable

四、手机自带的内存管理器查看

android navive 内存监测 安卓内存监测_压力测试

四、实时内存查看

adb shell top

由于篇幅有限,就不在这里写top命令的使用了,在网上查到了下面2个写的比较好的。
点击ADB Shell Top详解可查看更多top命令的参数

分析内存假占满现象

127|HNR553T:/ $ free -h
                total        used        free      shared     buffers
Mem:             5.1G        5.0G         64M        5.5M        5.2M
-/+ buffers/cache:           5.0G         69M
Swap:            3.1G        166M        3.0G

在使用free -h看到used占满了,但手机是还有内存可以给应用程序使用的。
因为在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的,当free内存不够时,内核就会回收buffers和cache的内存来给应用程序使用。
所以,可使用的内存available = free+buffers+cached,通过dumpsys meminfo命令的Free RAM参数可以直接得到能给应用程序使用的空闲内存大小。