一、概述

1.1 内存指标概念

Item 全称 含义 等价
USS Unique Set Size 物理内存 进程独占的内存
PSS Proportional Set Size 物理内存 PSS= USS+ 按比例包含共享库
RSS Resident Set Size 物理内存 RSS= USS+ 包含共享库
VSS Virtual Set Size 虚拟内存 VSS= RSS+ 未分配实际物理内存

故内存的大小关系:VSS >= RSS >= PSS >= USS

1.2 内存分析命令

常用的内存调优分析命令:

  1. dumpsys meminfo
  2. procrank
  3. cat /proc/meminfo
  4. free
  5. showmap
  6. vmstat

二 命令说明

1. dumpsys meminfo

dumpsys meminfo命令的输出结果分以下4部分:

序列 划分类型 排序 解释
1 process PSS 以进程的PSS从大到小依次排序显示,每行显示一个进程;
2 OOM adj PSS Native/System/Persistent/Foreground/Visible/Perceptible/A Services/Home/B Services/Cached,分别显示每类的进程情况
3 category PSS 以Dalvik/Native/.art mmap/.dex map等划分的各类进程的总PSS情况
4 total - 总内存、剩余内存、可用内存、其他内存

命令内容:

  1. Total PSS by process: //以process来划分
  2. kB: com.android.systemui (pid )
  3. kB: system (pid )
  4. kB: com.android.settings (pid / activities)
  5. kB: surfaceflinger (pid )
  6. ...
  7.  
  8. Total PSS by OOM adjustment: //以oom来划分,会详细列举所有的类别的进程,此处省略.
  9. kB: Native
  10. kB: surfaceflinger (pid )
  11. kB: mediaserver (pid )
  12. kB: zygote (pid )
  13. ...
  14. kB: System
  15. kB: Persistent
  16. kB: Foreground
  17. kB: Visible
  18. kB: Perceptible
  19. kB: A Services
  20. kB: Home
  21. kB: B Services
  22. kB: Cached
  23.  
  24. Total PSS by category: // 以category划分
  25. kB: Dalvik
  26. kB: Native
  27. kB: EGL mtrack
  28. kB: .so mmap
  29. kB: .art mmap
  30. kB: .dex mmap
  31. kB: Dalvik Other
  32. kB: .oat mmap
  33. kB: Stack
  34. kB: Gfx dev
  35. kB: Unknown
  36. kB: .apk mmap
  37. kB: Other mmap
  38. kB: .ttf mmap
  39. kB: Other dev
  40. kB: .jar mmap
  41. kB: Ashmem
  42. kB: Cursor
  43. kB: GL mtrack
  44. kB: Other mtrack
  45.  
  46. //整体情况
  47. Total RAM: kB (status moderate)
  48. Free RAM: kB ( cached pss + cached kernel + free)
  49. Used RAM: kB ( used pss + kernel)
  50. Lost RAM: kB
  51. ZRAM: kB physical used for kB in swap ( kB total swap)
  52. Tuning: (large ), oom kB, restore limit kB (high-end-gfx)

另外,可只输出某个pid或package的进程信息:

  1. dumpsys meminfo <pid> // 输出指定pid的某一进程
  2. dumpsys meminfo --package <packagename> // 输出指定包名的进程,可能包含多个进程

2. procrank

功能: 获取所有进程的内存使用的排行榜,排行是以Pss的大小而排序。procrank命令比dumpsys meminfo命令,能输出更详细的VSS/RSS/PSS/USS内存指标。

最后一行输出下面6个指标:

total free buffers cached shmem slab

执行结果:

  1. root@Phone:/# procrank
  2. PID Vss Rss Pss Uss cmdline
  3. 2270020K 202312K 136099K 121964K com.android.systemui
  4. 2280404K 147048K 89883K 84144K system_server
  5. 2145676K 97880K 44328K 40676K com.android.settings
  6. 1458332K 61876K 23609K 9736K zygote
  7. 2105784K 68056K 21665K 19592K com.android.phone
  8. 164392K 24068K 17970K 15364K /system/bin/mediaserver
  9. 200892K 27272K 15930K 11664K /system/bin/surfaceflinger
  10. ...
  11. RAM: 2857032K total, 998088K free, 78060K buffers, 459780K cached, 312K shmem, 92392K slab

3. cat /proc/meminfo

功能:能否查看更加详细的内存信息

  1. 指令: cat /proc/meminfo

输出结果如下(结果内存值不带小数点,此处添加小数点的目的是为了便于比对大小):

  1. root@phone:/ # cat /proc/meminfo
  2. MemTotal: 2857.032 kB //RAM可用的总大小 (即物理总内存减去系统预留和内核二进制代码大小)
  3. MemFree: 1020.708 kB //RAM未使用的大小
  4. Buffers: 75.104 kB //用于文件缓冲
  5. Cached: 448.244 kB //用于高速缓存
  6. SwapCached: kB //用于swap缓存
  7.  
  8. Active: 832.900 kB //活跃使用状态,记录最近使用过的内存,通常不回收用于其它目的
  9. Inactive: 391.128 kB //非活跃使用状态,记录最近并没有使用过的内存,能够被回收用于其他目的
  10. Active(anon): 700.744 kB //Active = Active(anon) + Active(file)
  11. Inactive(anon): kB //Inactive = Inactive(anon) + Inactive(file)
  12. Active(file): 132.156 kB
  13. Inactive(file): 390.900 kB
  14.  
  15. Unevictable: kB
  16. Mlocked: kB
  17.  
  18. SwapTotal: 524.284 kB //swap总大小
  19. SwapFree: 524.284 kB //swap可用大小
  20. Dirty: kB //等待往磁盘回写的大小
  21. Writeback: kB //正在往磁盘回写的大小
  22.  
  23. AnonPages: 700.700 kB //匿名页,用户空间的页表,没有对应的文件
  24. Mapped: 187.096 kB //文件通过mmap分配的内存,用于map设备、文件或者库
  25. Shmem: . kB
  26.  
  27. Slab: 91.276 kB //kernel数据结构的缓存大小,Slab=SReclaimable+SUnreclaim
  28. SReclaimable: 32.484 kB //可回收的slab的大小
  29. SUnreclaim: 58.792 kB //不可回收slab的大小
  30.  
  31. KernelStack: 25.024 kB
  32. PageTables: 23.752 kB //以最低的页表级
  33. NFS_Unstable: kB //不稳定页表的大小
  34. Bounce: kB
  35. WritebackTmp: kB
  36. CommitLimit: 1952.800 kB
  37. Committed_AS: 82204.348 kB //评估完成的工作量,代表最糟糕case下的值,该值也包含swap内存
  38.  
  39. VmallocTotal: 251658.176 kB //总分配的虚拟地址空间
  40. VmallocUsed: 166.648 kB //已使用的虚拟地址空间
  41. VmallocChunk: 251398.700 kB //虚拟地址空间可用的最大连续内存块

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

4.free

主功能:查看可用内存,缺省单位KB。该命令比较简单、轻量,专注于查看剩余内存情况。数据来源于/proc/meminfo。

输出结果:

  1. root@phone:/proc/sys/vm # free
  2. total used free shared buffers
  3. Mem:
  4. -/+ buffers:
  5. Swap:
  • 对于Mem行,存在的公式关系: total = used + free;
  • 对于-/+ buffers行: 1760936 = 1836040 - 75104(buffers); 1096096 = 1020992 + 75104(buffers);

5. showmap

主功能:用于查看虚拟地址区域的内存情况

  1. 用法: showmap -a [pid]

该命令的输出每一行代表一个虚拟地址区域(vm area)

  1. root@phone:/ # showmap -a
  2. start end virtual shared shared private private
  3. addr addr size RSS PSS clean dirty clean dirty object
  4. -------- -------- -------- -------- -------- -------- -------- -------- -------- ------------------------------
  5. f3b87000 f3d85000 /dev/binder
  • start addr和end addr:分别代表进程空间的起止虚拟地址;
  • virtual size/ RSS /PSS这些前面介绍过;
  • shared clean:代表多个进程的虚拟地址可指向这块物理空间,即有多少个进程共享这个库;
  • shared: 共享数据
  • private: 该进程私有数据
  • clean: 干净数据,是指该内存数据与disk数据一致,当内存紧张时,可直接释放内存,不需要回写到disk
  • dirty: 脏数据,与disk数据不一致,需要先回写到disk,才能被释放。

功能与cat /proc/[pid]/maps基本一致。

6. vmstat

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

用法:

  1. Usage: vmstat [ -n iterations ] [ -d delay ] [ -r header_repeat ]
  2. -n iterations 数据循环输出的次数
  3. -d delay 两次数据间的延迟时长(单位:S)
  4. -r header_repeat 循环多少次,再输出一次头信息行

输入结果:

  1. root@phone:/ # vmstat
  2. procs memory system cpu
  3. r b free mapped anon slab in cs flt us ni sy id wa ir

参数列总共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

小结

  1. dumpsys meminfo适用场景: 查看进程的oom adj,或者dalvik/native等区域内存情况,或者某个进程或apk的内存情况,功能非常强大;
  2. procrank适用场景: 查看进程的VSS/RSS/PSS/USS各个内存指标;
  3. cat /proc/meminfo适用场景: 查看系统的详尽内存信息,包含内核情况;
  4. free适用场景: 只查看系统的可用内存;
  5. showmap适用场景: 查看进程的虚拟地址空间的内存分配情况;
  6. vmstat适用场景: 周期性地打印出进程运行队列、系统切换、CPU时间占比等情况;

Android内存分析命令(转)的更多相关文章

  1. Android内存分析工具

    在Android系统开发过程中,经常会要去分析进程的内存的使用情况,简单介绍下Android内存分析的相关工具. 文章参考: 1.dumpsys 2.memory-analysis-command 1 ...

  2. Android 内存分析工具 MAT(Memory Analyzer Tool)

    如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...

  3. 记一次Android内存分析过程

    前言 上周五的时候,祝峰找到我,反映了Android收银台买单结果页内存飙升的问题.我在自己的机器上也试着重现了一下,发现从支付台-微信支付成功并返回后,进入买单结果页的内存会突然增大,导致GC,如图 ...

  4. Android内存分析工具DDMS heap + MAT 安装和使用

    一  Java内存分析工具扫盲 如果像我一样一点都不了解,可以先进行内存分析工具扫盲   MAT介绍:     Eclipse Memory Analyzer(MAT)一个功能丰富的 JAVA 堆转储 ...

  5. android内存分析:heap Snapshot的使用

    网上有很多讲解关于android studio中memory工具的使用,接下来我来说一段在项目中发生的实例:大家可以根据我的这个方法来分析自己项目中的问题 首先我们要通过手动先触发GC操作,点击mem ...

  6. Android 内存分析工具 - LogCat GC

    一.GC_Reason 触发垃圾回收的回收的集中原因: 类型 描述 GC_CONCURRENT 内存使用将满时,并发的进行垃圾回收. GC_FOR_MALLOC 当内存已满应用尝试分配内存时会出触发垃 ...

  7. JVM堆空间结构及常用的jvm内存分析命令和工具

    jdk8之前的运行时数据区域 程序计数器 是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.每个线程都有一个独立的程序计数器,这类内存区域为"线程私有",此内存 ...

  8. Android 内存分析

    1.使用adb命令查看app内存使用情况 adb shell dumpsys meminfo <package_name> adb shell top | grep <package ...

  9. 说下Java堆空间结构,及常用的jvm内存分析命令和工具

    Java堆空间结构图:http://www.cnblogs.com/SaraMoring/p/5713732.html JVM内存状况查看方法和分析工具: http://blog.csdn.net/n ...

随机推荐

  1. Material Designer的低版本兼容实现(十四)—— CardView

    今天说的又是一个5.0中才有的新控件——CardView(卡片视图).这个东东其实我们早就见过了,无论是微博还是人人客户端,它都有出现.通常我们都是通过自定义一个背景图片,然后通过给layout进行设 ...

  2. 使用自定义的Adapter来设置ListView的内容

    这里主要是学习的Adapter的机制 MainActivity.java package com.kale.listview; import android.app.Activity; import ...

  3. PreApplicationStartMethodAttribute程序启动扩展

    一.PreApplicationStartMethodAttribute 类简介 应用程序启动时提供的扩展的支持. 命名空间:   System.Web程序集:  System.Web(位于 Syst ...

  4. 白话Spring(基础篇)---AOP(execution表达式)

    作为AOP的最后一节内容,我们来简单总结一下切面表达式上见的书写方法.下面的那内容有参考其他博文,在此先对开源博客的各位大神表示感谢! -------------------------------- ...

  5. ARCH模型

    ARCH模型的基本思想 ARCH模型的基本思想是指在以前信息集下,某一时刻一个噪声的发生是服从正态分布.该正态分布的均值为零,方差是一个随时间变化的量(即为条件异方差).并且这个随时间变化的方差是过去 ...

  6. bat 批处理切换到当前脚本所在文件夹

    bat 批处理切换到当前脚本所在文件夹   切换到当前脚本所在的文件夹 ? 1 cd  %~dp0 另外附上一些bat基本内容 —————————————————————————————— 批处理常用 ...

  7. source insight 4.0.086破解

     source insight 4.0.093 破解: 1. 安装原版软件:Source Insight Version 4.0.0093 - March 20, 2018 2. 替换原主程序:sou ...

  8. 为sharepoint的内部页面添加后台代码

    我们知道,存储在数据库里的SharePoint页面是不能直接添加后台代码的,这给我们带来了很多的不方便,比如想要在页面上实现一些东西,都必 须使用Webpart或者自定义控件的方式,哪怕仅仅是很简单的 ...

  9. jQuery中的编程范式

    浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了 ...

  10. Java设计模式(六)合成模式 享元模式

    (十一)合成模式 Composite 合成模式是一组对象的组合,这些对象能够是容器对象,也能够是单对象.组对象同意包括单对象,也能够包括其它组对象,要为组合对象和单对象定义共同的行为.合成模式的意义是 ...