分类: Android平台
2014-03-19 17:37:30
1、 procrank
它从/proc/pid/maps中读取信息来进行统计。源码位于:/system/extras/procrank。
使用命令“adb shell procrank”,该命令可以列出当前系统所有进程的内存占用情况。输出如下类似结果:
PID Vss Rss Pss Uss cmdline
…
2319 42068K 42032K 13536K 7028K com.xxx
…
其中:
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
2、 dumpsys meminfo
使用命令:adb shell dumpsys meminfo $package_name or $pid,可更细致的查看某具体应用内存是如何使用。
3、 showmap
adb shell showmap命令也是读取smaps文件,但结果细化的具体的vm area。该命令输出的每行表示一个vm area,列出了该vm area的start addr, end addr, Vss, Rss, Pss, shared clean, shared dirty, private clean, private dirty,object。dumpsys meminfo其实就是读取这些数据,然后分类(native, dalvik, .so map, etc.)统计生成。
注1:通过读取/proc/meminfo文件查看memory信息,cat /proc/meminfo
注2:多数时候,发生OOM 都是在做一些跟图片相关的操作,如下建议可尽量减少这种情况的发生:
l decode bitmap 的时候,尽量配置下Options,例如:inSameSize
l Bitmap使用完以后,调用 bitmap.recycle()来释放内存
l 如果应用是基于图片的应用,尽量采用LazyLoad和DymanicRecycle
l decode bitmap 的时候,将decode代码 try catch 出来,catch oom error,避免程序crash,可以在catch里面做一些释放内存操作。