Android下通过smaps获取内存

本文章转载于搜狗测试

最近某Android项目在进行内存的优化,一直以来内存的获取使用的是dumpsys meminfo命令获取的,但是由于其内存值不够详尽,后改用smaps获取,将此分享内容给大家。

获取内存方法一:dumpsys meminfo

在adb下输入如下命令:adb shell dumpsys meminfo

Android下通过smaps获取内存_第1张图片

各个字段的含义:

Android下通过smaps获取内存_第2张图片

这种方法获取内存可能存在一个问题:获取内存不够精准如果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文件

Android下通过smaps获取内存_第3张图片

文件结构:

400ca000-400cb000:本段虚拟内存的地址范围

r-xp:文件权限,r(读)、w(写)、x(执行)、p表示私有,s代表共享,如果不具有哪项权限用"-"代替

00000000:映射文件的偏移量

b3:11:文件设备号

1345:被映射到虚拟内存文件的映索节点

Android下通过smaps获取内存_第4张图片

dumpsys meminfo 和 smaps的关系

dumpsys meminfo 命令下的 Pss、Shared Dirty、Private Dirty这三列的数据是读取smaps文件生成。

附录:

以下是对比搜狗手机输入法的.dex mmap、.ttf mmap、.so mmap与smaps中对应值的数据,从结果上来看,数据趋势是一样的。

Note:因为获取两种内存的工具读取时间不一样,所以曲线不会完全精准match。

Android下通过smaps获取内存_第5张图片

你可能感兴趣的:(Android下通过smaps获取内存)