android性能分析之内存优化

命令

android性能分析之常用命令

  • 查看系统内存状态
    cat /proc/meminfo
    adb shell procrank (pid)
    adb shell dumpsys meminfo/cpuinfo <package_name>/pid内查看本地层程序
    top -t -m 5 -n 2 查询Cpu/内存的基本使用
    adb shell cat /proc/buddyinfo
    adb shell cat /proc/meminfo // 查看更加详细的内存信息
    adb shell cat /proc/pid/maps
  • 查看内存碎片状态
    cat /proc/pagetypeinfo
  • 查看应用的graphic缓存(如纹理缓存)
    dumpsys gfxinfo
  • 查看进程内的位图
    dumpsys gfxinfo [pid] -b
  • 查看lowmemorykiller阈值
    cat /sys/module/lowmemorykiller/parameters/minfree
    cat /sys/module/lowmemorykiller/parameters/adj
  • 查看ion buffer使用情况,比如起camera的时候会有大量的ion使用
    cat /d/ion/heaps/system
  • App进程分配到的最大内存
    adb shell getprop | grep dalvik.vm.heapsize
  • dumpsys meminfo

查看进程的oom adj,或者dalvik/native等区域内存情况,或者某个进程或apk的内存情况
dumpsys meminfo // 输出指定pid的某一进程
dumpsys meminfo --package // 输出指定包名的进程,可能包含多个进程

adb shell dumpsys meminfo 包名

  • Pss: 该进程独占的内存+与其他进程共享的内存(按比例分配,比如与其他3个进程共享9K内存,则这部分为3K)
  • Privete Dirty:该进程独享内存
  • Heap Size:分配的内存
  • Heap Alloc:已使用的内存
  • Heap Free:空闲内存
  • procrank

procrank命令比dumpsys meminfo命令,能输出更详细的VSS/RSS/PSS/USS内存指标。

  • 最后一行输出下面6个指标
    total free buffers cached shmem slab
    VSS是单个进程全部可访问的地址空间,其大小可能包括还尚未在内存中驻留的部分。对于确定单个进程实际内存使用大小,VSS用处不大。
    RSS是单个进程实际占用的内存大小,RSS不太准确的地方在于它包括该进程所使用共享库全部内存大小。对于一个共享库,可能被多个进程使用,实际该共享库只会被装入内存一次。进而引出了PSS,PSS相对于RSS计算共享库内存大小是按比例的。N个进程共享,该库对PSS大小的贡献只有1/N。
    USS:Unique Set Size 进程独自占用的物理内存,不包含与其他进程共享占用的内存。USS去掉的是所有跨进程共享的内存,不是只去掉了共享库
    VSS = 虚拟内存,进程独占已分配但未使用内存 + 进程独占已用内存 + 共享内存
    RSS = 进程独占已用内存 + 共享内存
    PSS = 进程独占已用内存 + 共享内存/n
    USS = 进程独占已用内存
    dumpsys meminfo 使用的都是PSS
  • cat /proc/meminfo

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

root@phone:/ # 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

  • showmap

用于查看虚拟地址区域的内存情况
showmap -a [pid]
功能与cat /proc/[pid]/maps基本一致
该命令的输出每一行代表一个虚拟地址区域(vm area)

  • 解释
    start addr和end addr:分别代表进程空间的起止虚拟地址;
    virtual size/ RSS /PSS这些前面介绍过;
    shared clean:代表多个进程的虚拟地址可指向这块物理空间,即有多少个进程共享这个库;
    shared: 共享数据
    private: 该进程私有数据
    clean: 干净数据,是指该内存数据与disk数据一致,当内存紧张时,可直接释放内存,不需要回写到disk
    dirty: 脏数据,与dis
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值