文档章节

Android上的内存监测

每天多一点
 每天多一点
发布于 2014/05/05 17:39
字数 1108
阅读 160
收藏 0

Android平台上监测内存的手段主要有如下几种:

1. proc下的meminfo句柄(Linux上通用)

adb shell cat /proc/meminfo

得到的信息类似如下:

MemTotal:        1966140 kB
MemFree:          363148 kB
Buffers:           88184 kB
Cached:           637936 kB
SwapCached:            0 kB
Active:           991268 kB
...

可以看到内存的使用量为1966240 - 363148 - 88184 - 637936

上面的free memory的计算方法是 free memory = MemFree + Cached +Buffers

也有一种说法是free memory = MemFree + Cached


2. 使用vmstat工具

Android上提供了vmstat的移植,使用如下的命令就可以得到内存和cpu的使用量

adb shell vmstat

之后vmstat就会持续输出相关的信息。

 r  b    free mapped   anon   slab    in   cs  flt  us ni sy id wa ir
 1  0  321972 153012 630188  83180   168  348    0   2  0  1 96  0  0
 1  0  321972 153012 630188  83180   180  355    0   0  0  0 96  0  0
 2  0  321972 153012 630192  83180   201  407    0   3  0  0 93  0  0
 1  0  321972 153012 630192  83180   205  389    0   3  0  1 95  0  0

其中,

r 代表在运行队列中等待的进程数
b代表在等待io的进程数

使用 vmstat -h 可以得到参数帮助。

注意,如果在host PC上使用adb shell vmstat可以将输出重定向到本地文件,而在目标机器上直接运行vmstat是无法重定向的。这里有一个解决方案,供参考,需要重新编译vmstat。

vmstat不但可以显示内存的使用情况,还包括进程数以及cpu占用。一个比较典型的应用是根据'r'和'b'的数量来判断是否有卡顿的产生。vmstat一个比较大的局限在于只能输出全局的信息,无法针对某一个进程的信息。


3. 使用Procrank工具(限于ENG版本)。

Android提供了Procrank工具来监测内存的使用情况,可以配合showmap等工具来分析内存的使用。

使用命令如下:

adb shell procrank

然后可以得到如下的输出:


这里主要需要看懂几个定义:

VSS:进程可以访问到的所有内存的总量,一般来说很少用VSS来衡量进程的内存占用。

RSS:进程在RAM中所占用的内存,因为其包含共享库的内存量,所以用其来衡量独立进程的内存使用是不精确的。

PSS:也是进程在RAM中所占用的内存。区别于RSS的地方是,其将分摊共享库在内存中的占用分摊到了使用这个共享库的所有进程。

USS:进程私有的内存占用量。

如果想看看进程内存分配的详细情况,可以通过如下的命令

adb shell showmap [pid]

例如xxx可以得到如下的输出:



4. dumpsys meminfo命令

在Android上可以使用dumpsys命令来获得系统当前的状态信息。其中,就有内存信息。如果使用meminfo参数,我们能够给快速的得到想要的内存占用信息

adb shell dumpsys meminfo [package name]

例如:

adb shell dumpsys meminfo com.android.systemui

可以得到如下的输出:

Applications Memory Usage (kB):
Uptime: 44722331 Realtime: 153834350

** MEMINFO in pid 1151 [com.android.systemui] **
                         Shared  Private     Heap     Heap     Heap
                   Pss    Dirty    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------
       Native       24        4       24    10548     8800      327
       Dalvik    21110     5224    21004    22008    18668     3340
       Cursor        2        4        0                           
       Ashmem        0        0        0                           
    Other dev     8048     4092     6020                           
     .so mmap     1781     2108     1396                           
    .jar mmap        0        0        0                           
    .apk mmap      434        0        0                           
    .ttf mmap      325        0        0                           
    .dex mmap     1187      180       44                           
   Other mmap      220       12      204                           
      Unknown     6788      392     6784                           
        TOTAL    39919    12016    35476    32556    27468     3667
 
 Objects
               Views:      553         ViewRootImpl:        3
         AppContexts:       39           Activities:        0
              Assets:        5        AssetManagers:        5
       Local Binders:       84        Proxy Binders:       62
    Death Recipients:        1
     OpenSSL Sockets:        0
 
 SQL
         MEMORY_USED:        0
  PAGECACHE_OVERFLOW:        0          MALLOC_SIZE:        0


5. top命令

adb shell top

可以得到如下的输出

User 3%, System 12%, IOW 0%, IRQ 0%
User 11 + Nice 0 + Sys 41 + Idle 287 + IOW 0 + IRQ 0 + SIRQ 0 = 339
  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
11307  0   9% R     1   1536K    788K     shell    top
17247  0   3% S     5   4488K    244K     shell    /sbin/adbd
 1320  2   1% S    37 876704K  46504K  fg u0_a13   android.process.media
11303  0   0% S     1      0K      0K     root     kworker/0:2
 1576  0   0% S     6   7620K    872K     root     /system/bin/mpdecision
 2148  1   0% S    29 879988K  55940K  fg system   com.miui.networkassistant
  289  0   0% S    12  70524K   8652K  fg system   /system/bin/surfaceflinger
 1151  0   0% S    34 915408K  70368K  fg system   com.android.systemui
10597  0   0% S     1      0K      0K     root     kworker/u:6
  139  0   0% S     1      0K      0K     root     mmcqd/0

内存相关的是VSS和RSS,定义可以参考#3的记载。

参考资料: 一个关于Android内存比较好的回答在这里

© 著作权归作者所有

共有 人打赏支持
每天多一点
粉丝 10
博文 11
码字总数 8562
作品 0
大连
程序员
Android Studio 3.2 都有哪些更新?这些关键点不要错过

作者:Jamal Eason, Android 产品经理 点击这里即刻下载 Android Studio 3.2。 Android Studio 3.2 是应用开发者切入最新的 Android 9 Pie 发布版和构建新的 Android App Bundle 的最佳途径。...

Android_开发者
10/16
0
0
Android内存管理、监测剖析

Android内存管理机制 Android内存管理主要有:LowMemory Killer机制,Ashmem,PMEM/ION及Native内存和Dalvik内存管理管理和JVM垃圾回收机制。 LowMemory Killer机制 源码位置drivers/staging...

Jerikc
2015/01/14
0
0
Android的内存泄漏和调试

Android的内存泄漏和调试 一、 Android的内存机制 Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然...

JasonZhao
2013/02/18
0
1
Android 之 内存管理

概述 在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在是少的...

等待流星
2014/03/08
0
0
Android的内存泄漏和调试

一、 Android的内存机制 Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象的释放是由垃圾回收...

crystaltiger
2013/08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 到底谁是小公猫……

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Trivium的单曲《Throes Of Perdition》 《Throes Of Perdition》- Trivium 手机党少年们想听歌,请使劲儿戳(这里) @小鱼丁:...

小小编辑
50分钟前
90
3
基础选择器

注意:本教程参考自网上流传的李兴华老师的jquery开发框架视频,但是苦于没有相应的配套笔记,由我本人做了相应的整理. 本次学习的内容 学习jquery提供的各种选择器的使用,掌握了jquery选择...

江戸川
56分钟前
1
0
Spring中static变量不能@value注入的原因

今天本想使用@Value的方式使类中的变量获得yml文件中的配置值,然而一直失败,获得的一直为null。 类似于这样写的。 public class RedisShardedPool { private static ShardedJedisPool pool...

钟然千落
今天
2
0
CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部