android查看内存使用情况

1.cat /proc/meminfo

   MemTotal: 所有可用RAM大小 (即物理内存减去一些预留位和内核的二进制代码大小)
 
    MemFree: LowFree与HighFree的总和
 
    Buffers: 用来给块设备做的缓冲大小(只记录文件系统的metadata以及 tracking in-flight pages,就是说 buffers是用来存储,目录里面有什么内容,权限等等。)
 
    Cached: 用来给文件做缓冲大小(直接用来记忆我们打开的文件). 它不包括SwapCached
 
    SwapCached: 已经被交换出来的内存,但仍然被存放在swapfile中。用来在需要的时候很快的被替换而不需要再次打开I/O端口。
 
    Active: 最近经常被使用的内存,除非非常必要否则不会被移作他用.
 
    Inactive: 最近不经常被使用的内存,非常用可能被用于其他途径.
 
    HighTotal:
    HighFree: 高位内存是指所有在860MB以上的内存空间,该区域主要用于用户空间的程序或者是缓存页面。内核必须使用不同的手法使用该段内存,因此它比低位内存要慢一些。
 
    LowTotal:
    LowFree: 低位可以达到高位内存一样的作用,而且它还能够被内核用来记录一些自己的数据结构。
                   Among many other things, it is where everything from the Slab is
                   allocated.  Bad things happen when you're out of lowmem.
 
    SwapTotal: 交换空间的总和
 
    SwapFree: 从RAM中被替换出暂时存在磁盘上的空间大小
 
    Dirty: 等待被写回到磁盘的内存大小。
 
    Writeback: 正在被写回到磁盘的内存大小。
 
    Mapped: 影射文件的大小。
 
    Slab: 内核数据结构缓存
 
    VmallocTotal: vmalloc内存大小
 
    VmallocUsed: 已经被使用的虚拟内存大小。
 
    VmallocChunk: largest contigious block of vmalloc area which is free
 
    CommitLimit:
    Committed_AS:

2、dumpsys meminfo

更多关于dumpsys的使用信息,可以查看:

https://blog.csdn.net/shift_wwx/article/details/42464293

可以dump的这些service都是在ServiceManager里面添加上的,例如meminfo是在:frameworks/base/services/java/com/android/server/am/ActivityManagerService.java的函数setSystemProcess添加的:

public static void setSystemProcess() {
        try {
            ActivityManagerService m = mSelf;
 
            ServiceManager.addService(Context.ACTIVITY_SERVICE, m, true);
            ServiceManager.addService(ProcessStats.SERVICE_NAME, m.mProcessStats);
            ServiceManager.addService("meminfo", new MemBinder(m));
            ServiceManager.addService("gfxinfo", new GraphicsBinder(m));
            ServiceManager.addService("dbinfo", new DbBinder(m));
            if (MONITOR_CPU_USAGE) {
                ServiceManager.addService("cpuinfo", new CpuBinder(m));
            }
            ServiceManager.addService("permission", new PermissionController(m));
 
            ApplicationInfo info =
                mSelf.mContext.getPackageManager().getApplicationInfo(
                            "android", STOCK_PM_FLAGS);
            mSystemThread.installSystemApplicationInfo(info);
 
            synchronized (mSelf) {
                ProcessRecord app = mSelf.newProcessRecordLocked(info,
                        info.processName, false);
                app.persistent = true;
                app.pid = MY_PID;
                app.maxAdj = ProcessList.SYSTEM_ADJ;
                app.makeActive(mSystemThread.getApplicationThread(), mSelf.mProcessStats);
                mSelf.mProcessNames.put(app.processName, app.uid, app);
                synchronized (mSelf.mPidsSelfLocked) {
                    mSelf.mPidsSelfLocked.put(app.pid, app);
                }
                mSelf.updateLruProcessLocked(app, false, null);
                mSelf.updateOomAdjLocked();
            }
        } catch (PackageManager.NameNotFoundException e) {
            throw new RuntimeException(
                    "Unable to find android system package", e);
        }
    }

来看一下MemBinder:

@Override
        protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
            if (mActivityManagerService.checkCallingPermission(android.Manifest.permission.DUMP)
                    != PackageManager.PERMISSION_GRANTED) {
                pw.println("Permission Denial: can't dump meminfo from from pid="
                        + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
                        + " without permission " + android.Manifest.permission.DUMP);
                return;
            }
 
            mActivityManagerService.dumpApplicationMemoryUsage(fd, pw, "  ", args, false, null);
}

最终调用的是:

mActivityManagerService.dumpApplicationMemoryUsage

具体的source code这里暂不作分析了。

通过code可以看出meminfo的几个参数如下:

t7-p1:/ # 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.

adb shell dumpsys meminfo <package_name>
其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找,下图是某个程序的内存使用情况:

130|t7-p1:/ # dumpsys meminfo com.neo.dsm                                      
Applications Memory Usage (in Kilobytes):
Uptime: 3964700 Realtime: 3964700

** MEMINFO in pid 4230 [com.neo.dsm] **
                   Pss  Private  Private     Swap     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap    58751    58644        0        0   160640   137494    23145
  Dalvik Heap     7461     7424        0        0    15397     9239     6158
 Dalvik Other     2220     2220        0        0                           
        Stack     1668     1668        0        0                           
       Ashmem     3470     3452        0        0                           
    Other dev        4        0        4        0                           
     .so mmap     2215      340      552        0                           
    .apk mmap     8224      404     7312        0                           
    .ttf mmap       11        0        0        0                           
    .dex mmap     4652        4     4648        0                           
    .oat mmap     2435        0      488        0                           
    .art mmap     1673     1348        0        0                           
   Other mmap      497        4      184        0                           
      Unknown     1618     1616        0        0                           
        TOTAL    94899    77124    13188        0   176037   146733    29303
 
 App Summary
                       Pss(KB)
                        ------
           Java Heap:     8772
         Native Heap:    58644
                Code:    13748
               Stack:     1668
            Graphics:        0
       Private Other:     7480
              System:     4587
 
               TOTAL:    94899      TOTAL SWAP (KB):        0
 
 Objects
               Views:        9         ViewRootImpl:        0
         AppContexts:        3           Activities:        1
              Assets:        2        AssetManagers:        2
       Local Binders:       14        Proxy Binders:       20
       Parcel memory:       30         Parcel count:      120
    Death Recipients:        0      OpenSSL Sockets:        1
            WebViews:        0
 
 SQL
         MEMORY_USED:        0
  PAGECACHE_OVERFLOW:        0          MALLOC_SIZE:       62
130|t7-p1:/ # top | grep com.neo.dsm
 4230 system   20   0   9% S   237 1551484K 139732K  fg com.neo.dsm
 4230 system   20   0   9% S   237 1551484K 139776K  fg com.neo.dsm

adb shell dumpsys meminfo PID

130|t7-p1:/ # dumpsys meminfo 4230
Applications Memory Usage (in Kilobytes):
Uptime: 4204302 Realtime: 4204302

** MEMINFO in pid 4230 [com.neo.dsm] **
                   Pss  Private  Private     Swap     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap    58795    58688        0        0   160128   137568    22559
  Dalvik Heap     9945     9908        0        0    15424     9255     6169
 Dalvik Other     2296     2296        0        0                           
        Stack     1644     1644        0        0                           
       Ashmem     3470     3452        0        0                           
    Other dev        4        0        4        0                           
     .so mmap     2217      340      552        0                           
    .apk mmap     8224      404     7312        0                           
    .ttf mmap       11        0        0        0                           
    .dex mmap     4652        4     4648        0                           
    .oat mmap     2494        0      520        0                           
    .art mmap     1935     1376      224        0                           
   Other mmap      497        4      184        0                           
      Unknown     1618     1616        0        0                           
        TOTAL    97802    79732    13444        0   175552   146823    28728
 
 App Summary
                       Pss(KB)
                        ------
           Java Heap:    11508
         Native Heap:    58688
                Code:    13780
               Stack:     1644
            Graphics:        0
       Private Other:     7556
              System:     4626
 
               TOTAL:    97802      TOTAL SWAP (KB):        0
 
 Objects
               Views:        9         ViewRootImpl:        0
         AppContexts:        3           Activities:        1
              Assets:        2        AssetManagers:        2
       Local Binders:       14        Proxy Binders:       20
       Parcel memory:       30         Parcel count:      120
    Death Recipients:        0      OpenSSL Sockets:        3
            WebViews:        0
 
 SQL
         MEMORY_USED:        0
  PAGECACHE_OVERFLOW:        0          MALLOC_SIZE:       62

重点关注如下几个字段:
(1) Native/Dalvik 的 Heap 信息
具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。

(2) Total 的 PSS 信息
这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。

其它部分的说明:

其他类型              smap 路径名称                       描述
 
Ashmem              /dev/ashmem            匿名共享内存用来提供共享内存通过分配一个多个进程
                                                         可以共享的带名称的内存块
Other dev            /dev/                         内部driver占用的在 “Other dev”                                                 
.so mmap             .so                           C 库代码占用的内存
.jar mmap            .jar                          Java 文件代码占用的内存
.apk mmap            .apk                          apk代码占用的内存
.ttf mmap            .ttf                          ttf 文件代码占用的内存
.dex mmap            .dex                          Dex 文件代码占用的内存
Other mmap                                         其他文件占用的内存 
————————————————

Lost RAM = Total RAM - Free RAM - Used RAM

使用adb shell procrank
手机中的sh是经过精简过的,有些手机可能没有 procrank 命令,可以使用genymotion模拟器,或是自己安装procrank命令。使用procrank时,命令行的输出入下图:

t7-p1:/ # procrank                                                             
  PID       Vss      Rss      Pss      Uss  cmdline
 4230  1573056K  140188K   93428K   88680K  com.neo.dsm
 2390  1593916K  101028K   58147K   51300K  system_server
 4616  1095468K   96800K   50089K   44624K  com.neo.xunfei
 4572  1046628K   74408K   33713K   30472K  com.neo.mqtt
 3444  1019260K   68924K   30019K   26620K  com.android.systemui
 3469  1018664K   65128K   25558K   22804K  com.neo.launcher
 4673  1053624K   57588K   24411K   22832K  com.neo.chat
 4353  1065292K   59252K   23753K   21724K  com.neo.n1
 4689  1053712K   54524K   22698K   21292K  com.neo.camap
 1716   263808K   33128K   21695K   20368K  /system/bin/cameraserver
 1711  1559472K   69612K   16489K    8832K  zygote
 3769  1010088K   52932K   16268K   13640K  com.android.phone
 5079  1015688K   53028K   16008K   12960K  com.android.settings
 3536  1006580K   52160K   14706K   12224K  com.google.android.inputmethod.pinyin
 5460  1004180K   50680K   13428K   11112K  com.softwinner.dvr
 1729   163844K   23736K   11420K    9308K  /system/bin/mediaserver
 5580   986864K   46500K   11029K    8888K  android.process.acore
 6713   990088K   46732K   10784K    8896K  com.neo.radio
 1708    24748K   10708K    9737K    9688K  /system/bin/logcat
 4879   984788K   43264K    8754K    7076K  com.neo.update
 4172   984236K   43232K    8237K    6232K  android.process.media
 4978   990080K   37016K    7410K    6232K  com.android.dialer
 1714    95524K   17952K    7385K    6160K  /system/bin/audioserver
 1724    79424K   17260K    6780K    5676K  media.codec
 5538   985716K   39532K    6676K    4320K  com.neo.xunfei:remote
 4533   981756K   38960K    6495K    5096K  com.neo.ble
 1725    69912K   17792K    6354K    4664K  /system/bin/mediadrmserver
 1728    89616K   17304K    6271K    5140K  media.extractor
 5294   984784K   35412K    6230K    4988K  cn.kuwo.kwmusiccar
 1719    64336K   16504K    5823K    4764K  /system/bin/drmserver
 4654   980312K   35484K    5800K    4628K  com.neo.blemusic
 3517   978072K   36312K    5557K    4276K  com.android.printspooler
 4837   976568K   35636K    5411K    2596K  android.ext.services
 5412   980168K   33832K    5403K    4312K  com.neo.music
 4193   977756K   34312K    4894K    3704K  com.android.keychain
 3900   978116K   33576K    4801K    3684K  com.android.smspush
 1685    59580K   14820K    4798K    3896K  /system/bin/displayservice
 2421    78744K    5572K    3280K    1408K  /system/bin/gocsdk
 1703    64068K   14908K    3090K     328K  /system/bin/gocsdk
 1595    15792K    3820K    2820K    2772K  /system/bin/logd
 1690    40504K    5388K    2666K    2328K  /system/bin/surfaceflinger
 1709     9124K    3356K    2409K    2360K  /system/bin/logcat
11643     6484K    3144K    2350K    2332K  procrank
 1600    11776K    3328K    1474K    1300K  /system/bin/vold
 1733    35764K    3012K    1428K    1340K  /system/bin/netd
 3961     8240K    2260K    1339K    1304K  /system/bin/sdcard
 4211     8240K    2176K    1255K    1220K  /system/bin/sdcard
 1760    13716K    4464K    1224K    1008K  /system/bin/neomcu
 1722     8052K    2780K    1052K     956K  /system/bin/keystore
 1705    14024K    2300K     995K     952K  /system/bin/rild
    1     8372K    1068K     801K     600K  /init
 1702    12820K     708K     679K     676K  /sbin/adbd
 1686     4568K    1624K     655K     628K  /system/bin/lmkd
 1057     2820K     848K     614K     388K  /sbin/ueventd
 4332     4844K    1580K     584K     556K  pppd
 1682     3548K    1308K     545K     528K  /system/bin/sh
 1720     5004K    1632K     539K     504K  /system/bin/installd
11619     4736K    1464K     480K     452K  sleep
 1688     4596K    1488K     467K     432K  /system/bin/servicemanager
 1743     4104K    1416K     452K     424K  /system/xbin/perfprofd
 1681     2996K     416K     408K     408K  /sbin/healthd
 1761     1456K     336K     336K     336K  /sbin/busybox
 1599     5348K    1580K     291K      72K  /system/bin/debuggerd
 1613     5092K     532K     245K      56K  debuggerd:signaller
                           ------   ------  ------
                          648966K  559376K  TOTAL

 RAM: 1793368K total, 558392K free, 3192K buffers, 671620K cached, 8536K shmem, 65080K slab

可以看到,在linux下表示内存的耗用情况有四种不同的表现形式:
 VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
 RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
 PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
 USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)


VSS:VSS表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已经申请但尚未使用的内存空间。在实际中很少用这种方式来表示进程占用内存的情况,用它来表示单个进程的内存使用情况是不准确的。
RSS:表示一个进程在RAM中实际使用的空间地址大小,包括了全部共享库占用的内存,这种表示进程占用内存的情况也是不准确的。
PSS:表示一个进程在RAM中实际使用的空间地址大小,它按比例包含了共享库占用的内存。假如有3个进程使用同一个共享库,那么每个进程的PSS就包括了1/3大小的共享库内存。这种方式表示进程的内存使用情况较准确,但当只有一个进程使用共享库时,其情况和RSS一模一样。
USS:表示一个进程本身占用的内存空间大小,不包含其它任何成分,这是表示进程内存大小的最好方式!
可以看到:VSS>=RSS>=PSS>=USS
 

查看进程占用cpu的情况:adb shell top -n 1 -d 0.5 | grep proc_ id

127|t7-p1:/ #  top -n 1 -d 0.5 | grep 4230
 4230 system   20   0   6% S   262 1576156K 136492K  fg com.neo.dsm
t7-p1:/ # 

adb shell top -m 数字 : 查看应用内存占用率,其中数字为返回的应用数量,从高到低排序 如:
adb shell top -m 10  查看10个进程的内存情况

系统强制释放内存:

页内存释放:
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches

如android在ActuvutyManageServer中解析meminfo信息,当caches值大于某个值,或者剩余内存小于内存总数的20%时,发起强制释放缓存,如下:

flushcache.sh文件内容:
#!/system/bin/busybox sh
/system/bin/log -t pagecache "flush page cache"
echo 1 > /proc/sys/vm/drop_caches

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值