怎么分析内存泄露

   上一篇《浅谈系统对app内存限制优化》说到了app占用内存大小可以通过设置largeheap提高系统的限制。但是这个不是万能的。我们应该对app的内存进行分析。避免内存泄露的情形。今天就来谈谈怎么看app是否与内存泄露和怎么分析。

  常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。为什么会出现内存泄露?可以参考:http://blog.csdn.net/seelye/article/details/8269705

  搞清楚内存泄露的原因后,我们可以通过开发工具eclipse 自带的 DDMS 工具分析各线程的内存使用情况或者idea 的Android Monitor来获取app运行的堆内存信息(这个更好用)。再通过MAT分析工具来分析是否存在内存泄露。

 具体步骤如下:

 1.电脑通过命令窗口,连接上设备

C:\Users\lr>adb connect 172.31.12.161
connected to 172.31.12.161:5555

2.连接后,打开idea或者Android studio的Android Monitor,选择调试的app的包名。Android Monitor会显示改app实时内存分配情形和cpu、gpu占用比例。如下:


可以通过这个memory一行的数据,大概分析出app是否有内存泄露。如在app内A页面进入页面B,返回A,发现内存增加很多返回不减少或者返回后减少不明显,此时就有可能有泄露了。但是不一定,因为java的gc不是实时执行,有可能对象已经不再引用,但是没有gc。此时可以手动点击上图箭头指向的按钮,进行手动gc。如果此时gc后,看看内存情况,如果还是很高就要进行下面的步骤了。


    3.点击上图箭头指向 按钮旁边按钮Dump Java Heap,抓取app的heap。如果怀疑A->B返回B出现泄漏,此时开启抓取heap时候,就应该就在设备上操作,才能抓取到整个过程的heap信息。此时等待一段时间,会生成一个hprof的文件。工程左侧的Captures目录下面。得到该文件,一般可以通过idea去分析是否有内存泄露。先点开文件,点击右上角的运行按钮,运行后,如果有内存泄露,会在下面显示出来。但是这个分析不是很详细,所以还是用MAT工具分析。但MAT需要标准的格式文件,需要如下操作转换一次:

    在Captures栏中,右键点击hprof文件,然后选择Export to standard .hprof并保存到电脑目录中。


  4. 使用MAT打开转换后的hprof文件,显示如下图


    点击histogram,此时出现下图.


此时可以搜索你想查询的对象,如activity等,点击右键,会出来一个下拉列表:


  exclude all phantom/weak/soft 是将所有的虚引用/软引用/弱引用都排除掉,因为只有强引用才会造成内存泄漏。点击之后显示的信息就是未被回收的对象。这样就找到了泄露的地方(如果没有那说明没有泄露)。这样就要查看代码去避免了哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值