Android 内存使用详情查询的几种方法

一. /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     buffers
    Mem:       2094276608  1672122368   422154240   229789696     2912256
    -/+ buffers/cache:     1669210112   425066496
    Swap:      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
         
         

        image
        image
        image
        image

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

        rk3288:/ # procrank -h
        Usage: 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  zygote
          10719  1697540K   97676K   24332K   19272K      16K       0K       0K       0K  com.android.vending
          10847  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 -h
          meminfo 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 checkin
          If [process] is specified it can be the name or
          pid of a specific process to dump.
           
           
          dumpsys meminfo 项意义

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

          rk3288:/ # dumpsys meminfo com.android.launcher3
          Applications 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 值,如果这两个值不断增大,则说明可能存在未释放内存的情况。

          • 0
            点赞
          • 3
            收藏
            觉得还不错? 一键收藏
          • 0
            评论

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

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

          请填写红包祝福语或标题

          红包个数最小为10个

          红包金额最低5元

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

          抵扣说明:

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

          余额充值