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

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

adbshellcat/proc/meminfo

得到的信息类似如下:

MemTotal:1966140kBMemFree:363148kBBuffers:88184kBCached:637936kBSwapCached:0kBActive:991268kB...

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

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

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


2. 使用vmstat工具

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

adbshellvmstat

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

rbfreemappedanonslabincsfltusnisyidwair103219721530126301888318016834802019600103219721530126301888318018035500009600203219721530126301928318020140703009300103219721530126301928318020538903019500

其中,

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

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

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

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


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

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

使用命令如下:

adbshellprocrank

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


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

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

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

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

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

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

adbshellshowmap[pid]

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



4. dumpsys meminfo命令

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

adbshelldumpsysmeminfo[packagename]

例如:

adbshelldumpsysmeminfocom.android.systemui

可以得到如下的输出:

ApplicationsMemoryUsage(kB):Uptime:44722331Realtime:153834350**MEMINFOinpid1151[com.android.systemui]**SharedPrivateHeapHeapHeapPssDirtyDirtySizeAllocFree------------------------------------Native24424105488800327Dalvik2111052242100422008186683340Cursor240Ashmem000Otherdev804840926020.sommap178121081396.jarmmap000.apkmmap43400.ttfmmap32500.dexmmap118718044Othermmap22012204Unknown67883926784TOTAL39919120163547632556274683667ObjectsViews:553ViewRootImpl:3AppContexts:39Activities:0Assets:5AssetManagers:5LocalBinders:84ProxyBinders:62DeathRecipients:1OpenSSLSockets:0SQLMEMORY_USED:0PAGECACHE_OVERFLOW:0MALLOC_SIZE:0


5. top命令

adbshelltop

可以得到如下的输出

User3%,System12%,IOW0%,IRQ0%User11+Nice0+Sys41+Idle287+IOW0+IRQ0+SIRQ0=339PIDPRCPU%S#THRVSSRSSPCYUIDName1130709%R11536K788Kshelltop1724703%S54488K244Kshell/sbin/adbd132021%S37876704K46504Kfgu0_a13android.process.media1130300%S10K0Krootkworker/0:2157600%S67620K872Kroot/system/bin/mpdecision214810%S29879988K55940Kfgsystemcom.miui.networkassistant28900%S1270524K8652Kfgsystem/system/bin/surfaceflinger115100%S34915408K70368Kfgsystemcom.android.systemui1059700%S10K0Krootkworker/u:613900%S10K0Krootmmcqd/0

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

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

更多相关文章

  1. GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
  2. 如何在后台运行Linux命令?
  3. No.11 使用firewall配置的防火墙策略的生效模式
  4. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  5. Android(安卓)VNC Server New
  6. Android(安卓)LayerBuffer
  7. android 点击退出程序
  8. ServiceManager & SystemService
  9. android monkey测试

随机推荐

  1. gdb 远程调试android进程
  2. Android -- TypedArray
  3. Android(安卓)3.2 联机测试adb驱动如何安
  4. Android控件开发之一----TextView
  5. Android Studio 默认debug证书位置在哪里
  6. Android短信欺诈(Smishing)漏洞
  7. Android 不支持 SYSV IPC (SYSV IPC)
  8. Android内存泄露检测(LeakCanary)
  9. 2014-11-6Android学习------Android(安卓
  10. Android OpenGL ES学习资料