本文章转载于搜狗测试
最近某Android项目在进行内存的优化,一直以来内存的获取使用的是dumpsys meminfo命令获取的,但是由于其内存值不够详尽,后改用smaps获取,将此分享内容给大家。
获取内存方法一:dumpsys meminfo
在adb下输入如下命令:adb shell dumpsys meminfo
各个字段的含义:
这种方法获取内存可能存在一个问题:获取内存不够精准,如果Android应用中的库文件,没有以.so后缀名结尾,那么这部分内存占用不会归为“.so mmap”中,而是归为"Other mmap"中。
获取内存方法二:smaps
在adb下输入如下命令:
adb -d shell ps | grepcom.sohu.inputmethod.sogou| awk '{print$2;}' //打印被测应用的进程id
adb -d shell su --command=\'cat /[PID]/smaps >/sdcard\' //把PID对应的smaps文件拷贝到手机的sdcard上。注意必须用cat,不能用cp
adb –d pull /sdcard/smaps //下载smaps文件
解析smaps文件
文件结构:
400ca000-400cb000:本段虚拟内存的地址范围
r-xp:文件权限,r(读)、w(写)、x(执行)、p表示私有,s代表共享,如果不具有哪项权限用"-"代替
00000000:映射文件的偏移量
b3:11:文件设备号
1345:被映射到虚拟内存文件的映索节点
dumpsys meminfo 和 smaps的关系
dumpsys meminfo 命令下的 Pss、Shared Dirty、Private Dirty这三列的数据是读取smaps文件生成。
附录:
以下是对比搜狗手机输入法的.dex mmap、.ttf mmap、.so mmap与smaps中对应值的数据,从结果上来看,数据趋势是一样的。
Note:因为获取两种内存的工具读取时间不一样,所以曲线不会完全精准match。
网友评论