内存泄漏事程序开发过程中最头疼的地方。Android的应用虽然是Java语言写的,也有垃圾回收机制,但是如果应用设计不当,还是会产生内存泄漏。
Android 查看内存的常用命令有top,ps。
如果要查看程序运行起来后,各个库占用的内存情况,可以使用system/xbin目录下的showmap,例如showmap 进程id。
如果要查看进程native和dalvik部分的内存使用情况,可以使用dumpsys meminfo 命令,例如 dumpsys meminfo 进程id/进程名 。
Android内存分析常用的工具有以下几种
1.DDMS的AllocationTracker
AllocationTracker是Android自带的工具。如果内存泄漏是由于某个对象反复创建但是没有回收造成的,那么通过AllocationTracker是很容易发现的。在"Get Allocation"按钮下的列表中,如果有大量相同类型的对象,而且分配的时的代码位置也相同,就说明可能发生了内存泄漏。
2.DDMS的DumpHeap
使用过程 VM Heap->Cause GC,然后table界面会显示进程当前内存的分配情况。这里面最重要的是第二项data object,它是进程的Heap堆中已经分配数据对象的信息。其中“count”属性表示数据对象的个数,“TotalSize”属性表示所有数据对象的大小。我们观察这个值得变化来推测是否有内存泄漏。正常情况下,TotalSize的值会在一个小范围的波动。
3. MAT
MAT是eclipse开发的内存分析工具,专门分析Java Heap的转存文件,能够帮助发现内存泄漏。我们可以通过TotalSize的值来判断应用是否发生了内存泄漏,但不知道具体在什么地方发生了泄漏,这时就需要MAT工具来分析了。使用前,先将Heap堆的数据dump出来,Dump HPROF file 得到一个hprof的文件,但是这个文件不能直接用于MAT分析,因为格式不同,我们可以使用Android提供的工具“hprof-conv”将文件转换成MAT可以识别的格式,例如 hprof-conv <infile> <outfile>
将转换后的文件用MAT打开,MAT的功能很复杂,具体使用见官方文档。
4.Valgrind
c++层的代码发生了内存泄漏使用Valgrind分析。Android 源码的external目录中集成了Valgrind的源码,mmm external/valgrind 编译后得到可执行文件,然后push到手机中就可以使用。它集成了一系列的工具,我们最常用的是memcheck,它检查出程序中内存管理存在的问题
(1)内存发生泄漏
(2)读写内存是发生越界
(3)读写已经释放的内存
(4)使用没有初始化的内存
(5)没有成对的使用new/delete,malloc/free......
Valgrind 检查一个程序 ,使用命令valgrind --tool =tool_name program_name
检查内存泄漏,使用命令 valgrind --tool=memcheck --leakcheck=yes program_name