Android内存泄漏调试工具

  预防

  • 不要维持到 Activity 的长久引用,对 activity 的引用应该和 activity 本身有相同的生命周期。

  • 尽量使用context-application代替context-activity

  • Activity 中尽量不要使用非静态内部类,可以使用静态内部类和WeakReference代替。

  检测

  静态检测

  静态检测主要是检测资源未关闭的情况,Eclipse 和 Android Studio 都可以检测出 IO 或者 Socket 未关闭的情况,然后在 finally 中关闭即可。

  动态监测

  动态检测主要是依靠 MAT 这个工具。2011 年 Google IO 有一个主题演讲,非常详细地讲解了内存泄露的检测,包含 MAT 工具的使用,值得一看。我在某项目中使用 MAT 检测,发现一处内存泄漏,分享一下过程。从首页到商户列表到商户详情再退回首页执行Dump HPROF File,查看 MAT 中的Histogram,过滤 Activity 后,结果如下:

Histogram

仍然存在ShopInfoActivity的实例,选中右键点击Merge Shortest Paths to GC Roots,结果如下:

此处输入图片的描述

  可以看到ShopDatabase中维持着ShopInfoActivity的引用,查看源代码如下:

 

public class ShopDatabase {           …          
   private static ShopDatabase instance;          
   public static ShopDatabase getInstance (Context context) {              
           if (instance == null && context != null) {                   instance = new ShopDatabase (context);               }               return instance;           }           protected Context context;           …       }

  很明显,静态变量instance长期持有context的引用,造成内存泄露。
所以动态检测内存泄露的一个简单思路就是随意操作 APP,最后返回首页,然后用 MAT 检测,查看是否存在 Activity 多于一个或者 Activity 不正常存在的问题。

  参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值