一. /proc/meminfo

android /proc/ 目录下为我们提供了操作系统几乎所有的状态信息,当然也包含系统的内存使用信息,下面列举了一些对应内存使用情况的目录信息:

/proc/meminfo           机器的内存使用情况/proc/pid/maps          pid 为进程号,显示当前进程所长用的虚拟地址cat /proc/pid/statm     pid 为进程号,第二列为正在使用的物理内存大小                        
    1. MemTotal:内存总数

    系统从加电开始到引导完成,BIOS等要保留一些内存,内核要保留一些内存,最后剩下可供系统支配的内存就是MemTotal。这个值在系统运行期间一般是固定不变的。

    2. MemFree:空闲内存数

    表示系统尚未使用的内存,MemUsed=MemTotal-MemFree 就是已被用掉的内存。

    3. MemAvailable:可用内存数

    应用程序可用内存数,系统中有些内存虽然已被使用但是可以回收的,比如 cache/buffer、slab 都有一部分可以回收,所以 MemFree 不能代表全部可用的内存,这部分可回收的内存加上 MemFree 才是系统可用的内存,即:MemAvailable≈MemFree+Buffers+Cached

    它是内核使用特定的算法计算出来的,是一个估计值。它与MemFree的关键区别点在于,MemFree是说的系统层面,MemAvailable是说的应用程序层面。

    4. Buffer:缓冲区内存数,用来给文件做缓冲大小
    5. Cache:缓存区内存数,用于高速缓存储器
    6. Active:最近常被使用的内存数
    7. Inative:不常被使用的内存数,很容易被系统移做他用
    8. slab:内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗
    9. SReclaimable: 可收回 Slab 的大小
    10. SUnreclaim:不可收回 Slab 的大小(SUnreclaim+SReclaimable=Slab)
    11. HightTotal:RAM 中高地址物理内存总和,只能被用户空间程序使用
    12. LowTotal:RAM 中内核和用户空间程序都可以使用的内存总和(对于 512M 的 RAM: lowTotal = MemTotal)

    二. $ free 命令

    free 命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。

    rk3288:/ # free                total        used        free      shared     buffersMem:       2094276608  1672122368   422154240   229789696     2912256-/+ buffers/cache:     1669210112   425066496Swap:      1046794240       90112  1046704128                        
      第一部分 Mem 行解释:1. total:内存总数2. used:已经使用的内存数3. free:空闲的内存数4. shared:多个进程共享的内存数5. buffers:缓存区内存数第二部分(-/+ buffers/cache)行解释:第二行可以理解成跟上面第一行的 total、used、free 这一些不对应,一共两个值,第一个是 (-buffers/cache),另一个是 (+buffer/cache)的值第一个值 (-buffers/cache):数值为:(Mem)used - (Mem)buffers含义为:应用程序真正使用的内存数,即所有应用程序已经使用的内存减去共享的内存数第二个值 (+buffer/cache):数值为:(Mem)free + (Mem)buffer含义为:应用程序可使用到的内存数,即当前未使用的内存数加上共享的内存数第三部分是交互内存的数,也就是通常所说的虚拟空间                        

        三. $ procrank 命令

        Android procrank 是按照内存占用情况对进程进行排序。因为它需要遍历 /proc 下的所有进程获取内存占用情况,所以在运行时候需要有 root 权限。可用排序的有 VSS、RSS、PSS、USS。

        首先说明一下应用内存耗用的几个单词的含义:

        VSS- Virtual Set Size       虚拟耗用内存(包含共享库占用的内存) RSS- Resident Set Size      实际使用物理内存(包含共享库占用的内存) PSS- Proportional Set Size  实际使用的物理内存(比例分配共享库占用的内存)    - PSS 与 RSS 的区别是按比例分配,也就是如果三个进程都使用了同一个共享库(占30页内存),    那么 PSS 认为每个进程占10页内存USS- Unique Set Size        进程独占的物理内存(不包含共享库占用的内存)    - USS 是非常有用的数据,因为它反映了运行一个特定进程真实的成本(增量成本)。    当一个进程被销毁后,USS 是真实返回给系统的内存。    当进程中存在一个可疑的内存泄露时,USS 是最佳观察数据。一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS            




        procrank 默认是按照 PSS 降序排列:

        rk3288:/ # procrank -hUsage: procrank [ -W ] [ -v | -r | -p | -u | -s | -h ]    -v  Sort by VSS.    -r  Sort by RSS.    -p  Sort by PSS.    -u  Sort by USS.    -s  Sort by swap.        (Default sort order is PSS.)    -R  Reverse sort order (default is descending).    -c  Only show cached (storage backed) pages    -C  Only show non-cached (ram/swap backed) pages    -k  Only show pages collapsed by KSM    -w  Display statistics for working set only.    -W  Reset working set of all processes.    -o  Show and sort by oom score against lowmemorykiller thresholds.    -h  Display this help screen.                        

          运行如下截图:

          rk3288:/ # procrank  PID       Vss      Rss      Pss      Uss     Swap    PSwap    USwap    ZSwap  cmdline  444  1753072K  184792K   81893K   70136K      12K       0K       0K       0K  system_server  939  1848736K  210904K   80151K   42500K      16K       0K       0K       0K  com.google.android.gms.persistent 1123  1966424K  203472K   73869K   36412K      16K       0K       0K       0K  com.google.android.gms  569  1743596K  170144K   62840K   50472K      16K       0K       0K       0K  com.android.systemui 1169  1772968K  171796K   62526K   38948K      16K       0K       0K       0K  com.google.android.googlequicksearchbox:search  547  1697384K  121448K   34972K   27716K      16K       0K       0K       0K  com.google.android.inputmethod.latin 1047  1714948K  137648K   32207K   18104K      16K       0K       0K       0K  com.android.launcher3  325  1560208K  118160K   26989K   15632K      32K      16K      16K      15K  zygote10719  1697540K   97676K   24332K   19272K      16K       0K       0K       0K  com.android.vending10847  1813588K  126940K   23057K    4188K      16K       0K       0K       0K  com.google.android.gms.unstable  971  1725516K  105736K   22103K    3280K      16K       0K       0K       0K  com.google.android.googlequicksearchbox:interactor  626  1661076K   95856K   17894K   11976K      16K       0K       0K       0K  com.android.phone 2538  1650844K   84140K   10332K    5172K      16K       0K       0K       0K  com.google.android.setupwizard            

          四. dumpsys meminfo

          Android 提供的 dumpsys 工具可以用于查看感兴趣的系统服务信息与状态,可以通过下面的命令查看本设备所支持查看的所有 service 信息

          dumpsys | grep "DUMP OF SERVICE"DUMP OF SERVICE mount:DUMP OF SERVICE netd:DUMP OF SERVICE netd_listener:DUMP OF SERVICE netpolicy:...            
          dumpsys 具体命令查看帮助

          dumpsys 支持的 service 非常多,可以通过 -h 查看相关的 service 帮助信息,以 meminfo 为例演示:

          rk3288:/ # dumpsys meminfo -hmeminfo dump options: [-a] [-d] [-c] [-s] [--oom] [process]  -a: include all available information for each process.  -d: include dalvik details.  -c: dump in a compact machine-parseable representation.  -s: dump only summary of application memory usage.  -S: dump also SwapPss.  --oom: only show processes organized by oom adj.  --local: only collect details locally, don't call process.  --package: interpret process arg as package, dumping all             processes that have loaded that package.  --checkin: dump data for a checkinIf [process] is specified it can be the name orpid of a specific process to dump.            
          dumpsys meminfo 项意义

          dumpsys meminfo 后面可以加单个进程名查看某进程的内存耗用信息

          rk3288:/ # dumpsys meminfo com.android.launcher3Applications Memory Usage (in Kilobytes):Uptime: 18025666 Realtime: 22799195** MEMINFO in pid 1047 [com.android.launcher3] **                   Pss  Private  Private  SwapPss     Heap     Heap     Heap                 Total    Dirty    Clean    Dirty     Size    Alloc     Free                ------   ------   ------   ------   ------   ------   ------  Native Heap     9541     9408        0        0    14336    10830     3505  Dalvik Heap     1875     1828        0        0     5102     2551     2551 Dalvik Other      554      552        0        0        Stack       36       36        0        0       Ashmem        2        0        0        0    Other dev       58        0       56        0     .so mmap     4711      236     1556        0    .apk mmap     5792        0      104        0    .ttf mmap      296        0       80        0    .dex mmap     3480        4     1908        0    .oat mmap     2174        0        0        0    .art mmap      875      520        4        0   Other mmap      436        4        0        0      Unknown      614      604        0        0        TOTAL    30444    13192     3708        0    19438    13381     6056 App Summary                       Pss(KB)                        ------           Java Heap:     2352         Native Heap:     9408                Code:     3888               Stack:       36            Graphics:        0       Private Other:     1216              System:    13544               TOTAL:    30444       TOTAL SWAP PSS:        0 Objects               Views:      113         ViewRootImpl:        1         AppContexts:       10           Activities:        1              Assets:        6        AssetManagers:        9       Local Binders:       27        Proxy Binders:       40       Parcel memory:       33         Parcel count:       51    Death Recipients:        2      OpenSSL Sockets:        0            WebViews:        0 SQL         MEMORY_USED:      963  PAGECACHE_OVERFLOW:      550          MALLOC_SIZE:      117 DATABASES      pgsz     dbsz   Lookaside(b)          cache  Dbname         4       60             73         7/29/6  /data/user/0/com.android.launcher3/databases/launcher.db         4      456             60        88/28/5  /data/user/0/com.android.launcher3/databases/app_icons.db         4       20             37         2/26/3  /data/user/0/com.android.launcher3/databases/widgetpreviews.db            
          Native heap 和 Dalvik heap 的区别
          比较简单的理解是: C/C++ 申请的内存空间在 native heap 中,而 java 申请的内存空间则在 dalvik heap  中。 dalvik heap 是 dalvik 虚拟机分配的内存,因为每一个应用都有一个虚拟机实例。            

          项解释如下:

          几个概念解释:- Pss表示进程占用的实际内存,将跨进程共享页也加进来,进行比例计算 Pss。- Dirty 与 clean进程独占内存,也就是进程销毁时可以回收的内存容量。通常 Private Dirty 内存是最重要的部分,因为只被自己进程使用。Dirty内存是已经被修改的内存页,因此必须常驻内存* .so mmap & .dex mmap ... mmap 映射本地或虚拟机代码到使用的内存中。* Unknown 无法归类的其他项。主要包括大部分的本地分配。* Native Heap native代码申请的内存, 堆和栈,及静态代码块等。* TOTAL进程总使用的实际内存。*Objects 显示持有对象的个数。这些数据也是分析内存泄漏的重要数据,如 activity            
          判断应用内存泄漏

          可以通过不断查看应用进程的 native heap 和 dalvik heap szie 值,如果这两个值不断增大,则说明可能存在未释放内存的情况。

          更多相关文章

          1. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
          2. 一款霸榜 GitHub 的开源 Linux 资源监视器!
          3. Android(安卓)App启动过程
          4. [置顶] android图形系统详解二:Drawables
          5. 【读书笔记《Android游戏编程之从零开始》】8.Android(安卓)游戏
          6. 安卓小米系统开发一些适配问题
          7. Android(安卓)多进程通信(2) - Binder、Messenger
          8. Android:自定义View(一)
          9. Android应用如何判断系统升级了?

          随机推荐

          1. Android基础--------Android常用控件介绍
          2. Android在线更新SDK的方法(使用国内镜像)
          3. android Shader类简介_渲染图像
          4. 异常 报错 Android(安卓)library project
          5. Android(安卓)滑动效果入门篇(一)—— View
          6. Android短信发送流程之普通短信发送(原)
          7. Kotlin编程之AndroidStudio(包括3.0与2.x
          8. android启动过程分析
          9. 【Android】线程/进程绑定指定CPU核
          10. Layout布局之相对布局