android 内存泄漏分析

    内存泄漏事程序开发过程中最头疼的地方。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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值