前一段时间陆陆续续写了一下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上。







更多相关文章

  1. android保存文件到手机内存
  2. Android原生(Native)C开发之二:framebuffer篇
  3. Android(安卓)上Camera分析
  4. Android应用程序启动过程源代码分析
  5. Android磁盘管理-系统源码分析(1)
  6. Android消息机制Handler源码分析
  7. Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
  8. Android进程与线程基本知识
  9. Android内存管理机制

随机推荐

  1. 带有无线电的JavaScript条件字段不起作用
  2. Sails.js套接字。好的和坏的一面。与sock
  3. JavaScript学习笔记:你必须要懂的原生JS(一
  4. IE下javascript cookie path设置Bug
  5. Javascript正则表达式应该允许空和非空字
  6. 我所理解的jQuery(2)--谈jQuery的整体设
  7. JS闭包学习笔记(2):循环和闭包
  8. 类似jQuery的extend扩展方法的实现
  9. Json返回[object object]而不是array
  10. JavaScript声明全局变量三种方式的异同