原文:http://lhq1013.iteye.com/blog/978303
简介:
smem是一个分析linux上内存使用量的内存工具。Android上提供的“ps”只能显示VSIZE和RSS这两类内存值。即使安装了busybox,“ps”也只能显示VSIZE。VSIZE是虚拟图形的总体大小,RSS是resident set size——实际使用的物理内存(包含共享库占用的内存)。这些数据对于显示某一特定的应用程序或守护进程的实际内存消耗来讲,是没有太多的用处的。
smem网站上说:
smem是一个能给出大量关于在linux系统上的内存使用报告的工具。不同于现有的工具的是,smem能报告PSS,即proortional set size实际使用的物理内存(比例分配共享库占用的内存),这一数据能更有效的陈述某一特定类库和应用程序在虚拟存储系统中的内存使用情况。
因为大部分的物理内存通常情况下是被多个应用程序所共享的,所以被认为是衡量内存使用标准的RSS(resident set size:实际使用物理内存,含共享库占用的内存)将明显地高估了内存使用。相反的,为了给出一个现实的措施,PSS权衡每一个应用公平地分享所有的共享区。
前期准备:
1、 合适的内核 (>2.6.27 or so) 查看当前内存版本可用“uname -a”
2、 合适的Python版本 (2.4 or so) 查看版本号可用“python -V”
另外,smem还可以产生非常漂亮的图表,为此,你还需安装python-matplotlib python-matplotlib-tk。
$ sudo apt-get install python-matplotlib python-matplotlib-tk
一、下载并编译
先用hg工具将已经存在的smem仓库拷贝到本地PC
$ hg clone http://selenic.com/repo/smem
用root权限将smem可执行文件拷贝到bin下面 设置路径
$ sudo cp smem/smem /usr/local/bin
用agcc对smemcap.c进行交叉编译
$ cd smem
$ agcc smemcap.c –o android-smemcap
注:agcc为封装了arm-eabi-gcc的perl脚本,地址为http://plausible.org/andy/agcc,使用时需将其全文复制下来后修改脚本的权限。运行agcc前除linux上已安装了perl解析器外,还需先在Android源码中执行build/envsetup.sh和choosecombo将Android环境配好。此外也可直接用arm-eabi-gcc直接进行交叉编译,示例可参考http://android-tricks.blogspot.com/2009/02/hello-world-c-program-on-using-android.html。
二、安装android-smemcap
用adb shell登录手机后创建所需的目录结构
$ adb shell mkdir /data/smem
将编译好的android-smemcap推送到手机中的目录
$ adb push android-smemcap /data/smem
修改执行文件的权限
$ adb shell chmod 777 /data/smem/android-smemcap
三、收集内存信息
进入手机相应的目录
$ adb shell
$ cd /data/smem
运行可执行文件并将结果重定向
$ ./android-smemcap > memdata.tar
$ exit
或直接执行如下命令:
$ adb shell “/data/smem/android-smemcap > /data/smem/memdata.tar”
四、将收集到的数据取回到PC上
$ adb pull /data/smem/memdata.tar
五、审阅数据
*目标程序进程数据视图
$ smem –S memdata.tar
*显示饼图
$ smem -S memdata.tar - -pie=command
或指定显示某一应用程序
$ smem -S memdata.tar -P com.* - -pie=command
*显示柱状图
$smem -S memdata.tar -bar=command
*显示系统中 所有的内存映射
$smem -S memdata.tar -m
*显示指定程序的映射
$smem -S memdata.tar -m -P email
*显示系统库
$smem -S memdata.tar -m -M /system/lib/*
*显示应用软件包的内存映射
$smem -S memdata.tar -m -M .*.apk
*找到拥有最大用户量得类库
$ smem -S memdata.tar -m -M lib -s pids
六、部分数据名称解释
a) VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
b) RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
c) PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
d) USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
PS:打包的tools.zip附件中包含了agcc脚本和已编译好的android-smemcap.
==================================================================================================================
smem 能够为你报告内存的占用情况,提供 PID、User、Command、Swap、USS、PSS、RSS 等信息。除了一般的文本信息报告外,smem 也可以生成条状或饼状图。
通过 smem --help
可以获得它的使用说明。
smem 要求 Kernel 2.6.27/Python 2.4 及以上版本、matplotlib 库。
smem
Read More: