Android内存分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/johnWcheung/article/details/87689753

dumpsys meminfo <pid>

在这里插入图片描述

procrank

PID Vss Rss Pss Uss cmdline
total free buffers cached shmem slab

从以上打印可以看出,一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

  • VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)是单个进程全部可访问的地址空间;

  • RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)是单个进程实际占用的内存大小,对于单个共享库, 尽管无论多少个进程使用,实际该共享库只会被装入内存一次;

  • PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存);

  • USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)USS 是一个非常非常有用的数字, 因为它揭示了运行一个特定进程的真实的内存增量大小。如果进程被终止, USS 就是实际被返还给系统的内存大小。

    USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。怀疑某个程序有内存泄露可以查看这个值是否一直有增加。

cat /proc/meminfo

MemTotal: 2857.032 kB //RAM可用的总大小 (即物理总内存减去系统预留和内核二进制代码大小)
MemFree: 1020.708 kB //RAM未使用的大小
Buffers: 75.104 kB //用于文件缓冲
Cached: 448.244 kB //用于高速缓存
SwapCached: 0 kB //用于swap缓存
Active: 832.900 kB //活跃使用状态,记录最近使用过的内存,通常不回收用于其它目的
Inactive: 391.128 kB //非活跃使用状态,记录最近并没有使用过的内存,能够被回收用于其他目的
Active(anon): 700.744 kB //Active = Active(anon) + Active(file)
Inactive(anon): 228 kB //Inactive = Inactive(anon) + Inactive(file)
Active(file): 132.156 kB
Inactive(file): 390.900 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 524.284 kB //swap总大小
SwapFree: 524.284 kB //swap可用大小
Dirty: 0 kB //等待往磁盘回写的大小
Writeback: 0 kB //正在往磁盘回写的大小
AnonPages: 700.700 kB
Mapped: 187.096 kB //通过mmap()分配的内存,用于map设备、文件或者库
Shmem: .312 kB
Slab: 91.276 kB //kernel数据结构的缓存大小,Slab=SReclaimable+SUnreclaim
SReclaimable: 32.484 kB //可回收的slab的大小
SUnreclaim: 58.792 kB //不可回收slab的大小
KernelStack: 25.024 kB
PageTables: 23.752 kB //以最低的页表级
NFS_Unstable: 0 kB //不稳定页表的大小
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1952.800 kB
Committed_AS: 82204.348 kB //评估完成的工作量,代表最糟糕case下的值,该值也包含swap内存
VmallocTotal: 251658.176 kB //总分配的虚拟地址空间
VmallocUsed: 166.648 kB //已使用的虚拟地址空间
VmallocChunk: 251398.700 kB //虚拟地址空间可用的最大连续内存块

对于cache和buffer也是系统可以使用的内存,所以系统总的可用内存为 MemFree+Buffers+Cached

free

  • Mem(物理内存分配情况)行

    • total:表示物理 内存总量

    • used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用

    • free:未被分配的内存

    • shared:共享内存,一般系统不会用到,这里也不讨论

    • buffers: 系统分配但未被使用的buffers 数量

    • cached:系统分配但未被使用的cache 数量

  • -/+ buffers/cache(物理内存实际使用情况)行

    • used:实际使用的buffers 与cache 总量,也是实际使用的内存总量

    • free:未被 使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存

    buffers和cache其实也是内存的一部分,这部分特殊的内存是可以回收的,甚至如果需要我们还可以将这部分buffers和cache给释放出来

  • Swap(虚拟内存)行-

    • total:表示虚拟内存总量

    • used:表示使用的虚拟内存大小

    • free:表示未使用的虚拟内存大小

showmap -a [pid]

用于查看虚拟地址区域的内存情况,该命令的输出每一行代表一个虚拟地址区域(vm area)

  • start addr和end addr:分别代表进程空间的起止虚拟地址

  • virtual size/ RSS /PSS:这些前面介绍过

  • shared clean:代表多个进程的虚拟地址可指向这块物理空间,即有多少个进程共享这个库

  • shared:共享数据

  • private:该进程私有数据

  • clean:干净数据,是指该内存数据与disk数据一致,当内存紧张时,可直接释放内存,不需要回写到disk

  • dirty:脏数据,与disk数据不一致,需要先回写到disk,才能被释放

vmstat

不仅可以查看内存情况,还可以查看进程运行队列、系统切换、CPU时间占比等情况,另外该指令还是周期性地动态输出。

Usage: vmstat [ -n iterations ] [ -d delay ] [ -r header_repeat ]

  • -n iterations //数据循环输出的次数
  • -d delay//两次数据间的延迟时长(单位:S)
  • -r header_repeat//循环多少次,再输出一次头信息行

参数列总共15个参数,分为4大类:

  • procs(进程)

    • r //Running队列中进程数量
    • b //IO wait的进程数量
  • memory(内存)

    • free //可用内存大小
    • mapped //mmap映射的内存大小
    • anon //匿名内存大小
    • slab //slab的内存大小
  • system(系统)

    • in //每秒的中断次数(包括时钟中断)
    • cs //每秒上下文切换的次数
  • cpu(处理器)

    • us //user time
    • ni //nice time
    • sy //system time
    • id //idle time
    • wa //iowait time
    • ir //interrupt time

top -p [pid]

Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [-t ] [ -h ]
    -m num  Maximum number of processes to display. 最多显示多少个进程
    -n num  Updates to show before exiting.  刷新次数 
    -d num  Seconds to wait between updates. 刷新间隔时间(默认5秒)
    -s col  Column to sort by (cpu,vss,rss,thr). 按哪列排序 
    -t      Show threads instead of processes. 显示线程信息而不是进程
    -h      Display this help screen.  显示帮助文档
  • 第一组数据的含义

    • User 处于用户态的运行时间,不包含优先值为负进程
    • Nice 优先值为负的进程所占用的CPU时间
    • Sys 处于核心态的运行时间
    • Idle 除IO等待时间以外的其它等待时间
    • IOW IO等待时间
    • IRQ 硬中断时间
    • SIRQ 软中断时间
  • 第二组数据的含义

    • PID 进程id
    • PR 优先级
    • CPU% 当前瞬时CPU占用率
    • S 进程状态:D=不可中断的睡眠状态, R=运行, S=睡眠, T=跟踪/停止, Z=僵尸进程
    • #THR 程序当前所用的线程数
    • VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
    • RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存)
    • PCY 调度策略优先级,SP_BACKGROUND/SP_FOREGROUND
    • UID 进程所有者的用户id
    • Name 进程的名称

总结

dumpsys meminfo适用场景

查看进程的oom adj,或者dalvik/native等区域内存情况,或者某个进程或apk的内存情况,功能非常强大

procrank适用场景

查看进程的VSS/RSS/PSS/USS各个内存指标

cat /proc/meminfo适用场景

查看系统的详尽内存信息,包含内核情况

free适用场景

只查看系统的可用内存

showmap适用场景

查看进程的虚拟地址空间的内存分配情况

vmstat适用场景

周期性地打印出进程运行队列、系统切换、CPU时间占比等情况

top适用场景

实时的对系统处理器的状态监视,它将显示系统中CPU最“敏感”的任务列表,该命令可以按CPU使用、内存使用和执行时间对任务进行排序

猜你喜欢

转载自blog.csdn.net/johnWcheung/article/details/87689753
今日推荐