转载地址:http://my.oschina.net/shaorongjie/blog/170663
前一段时间陆陆续续写了一下Android内存Debug的一些手段,现在整理一下,在这边提供一个链接,也做一下简单的总结。
VSS,RSS,PSS,USS
查看进程的内存使用情况
使用meminfo分析Android单个进程内存信息
使用showmap分析android进程内存占用情况
使用MAT分析Java内存
Android native Memory分析
1.一般来说,分析系统的内存情况可以用adb shell dumpsys meminfo查看当时的系统内存状况。接着可以使用《VSS,RSS,PSS,USS》一文中提到的adb shell procrank打出每个进程的内存分配情况。然后看哪个进程占用的内存不合理(一般是最大的或者紧接着的几个),找出这个进程来分析。
2.分析单个进程的时候可以用adb shell dumpsys meminfo -a <processname>/<processid>查看内存大体状况。具体的内存分配情况则需要用adb shell showmap <pid> 来看是哪个部分占用的比较多,或者抓一个正常和一个异常的进行对比看哪部分上升最快。(因为占用最多的也许是比较合理的)或者找到抓取process show map在每个时间的值, 编写脚本用图形化方式看哪部分上升最快。
3.如果是/dev/ashemem/dalvik-heap(deleted)占用的比较大,则是Java部分的Memory Leak, 可以使用adb shell am dumpheap <processname> /sdcard/<FileName>文件。然后再adb pull /sdcard/<FileName> .这个文件。将这个文件放在\android-sdk\tools目录下,在命令行(dos/linux terminal)中执行hprof-conv.exe <FileName> <newFileName>.hprof文件。这里需要转换的原因是因为Android的虚拟机dalvik和Java的虚拟机(HotSpot等)有点不同,需要转换成相应的格式。然后参考《使用MAT分析Java内存》一文分析Java Memory分配即可。也可以直接用《使用MAT分析Java内存》使用图形界面点击按钮直接分析。
4.至于其他的,大部分属于native的Memory leak了。可以用linux malloc debug的机制来分析。后面我再做总结,更新在这篇文章后。这边有个简单的文档供参考(但不是我写的)http://blog.csdn.net/elfylin/article/details/7902019
5.今天补充了一下native memory分析的办法,但此办法要求很多,也许只对做ROM的有所帮助,具体办法见
《Android native memory分析》
其实从上面可以看出来,Android的内存分析基本上是结合Linux和Java的内存分析工具,再加上Android提供的一些转化工具就可以分析了。VSS,USS,PSS,USS,showmap, malloc debug等都是Linux本来就有的。MAT和Hprof本身是Eclipse和Java原来就有的,只是需要转换一下。说这些的目的是想说如果Linux或者Java上的一些Debug手段也基本上可以用在Android上。