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
四、手机自带的内存管理器查看
四、实时内存查看
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参数可以直接得到能给应用程序使用的空闲内存大小。