LeakCanary检查内存泄露-笔记

LeakCanary检测内存泄露

内存泄露

  • 内存泄露的概念

    当一个对象已经不再需要却无法被GC回收,就是内存泄露

  • 内存泄露的危害
    “A small leak will sink a great ship.” - Benjamin Franklin
    千里之堤, 毁于蚁穴。 – 《韩非子·喻老》
    对于移动设备来说,运行内存想极其有限的,分配给每个app的内存也是有上限的,虽然内存泄露不是必定会造成内存溢出,但是内存泄露的多了,那么剩余可用内存就少了,在某个时候是很有可能造成app运行卡顿以及内存溢出的。
  • 内存泄露是如何造成的
    在Android中造成内存泄露的原因一般有一下几点:
    • Activity或者Fragment使用了static成员变量
    • 使用Handler发送延时消息
    • 注册某个监听器对象后没有取消注册,比如广播接收者
    • 生命周期过长的异步任务,比如异步请求网络,此时Activity退出了

LeakCanary

内存泄露的一般原因我们可能能够分析出来并会注意到,但是仍然有很多时候我们忽略掉。所以需要一些能够帮助我们检测到内存泄露的工具。而内存泄露的检测有很多工具,比如DDMS自带的Heap工具,MAT工具,但是这些工具的缺点就是使用步骤复杂,而且对内存泄露的定位没有LeakCanary精确,所以我们选择学习简单易用的LeakCanary类库。

  • 使用步骤

    • 添加依赖

      debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
      releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
      
    • 在全局Application的onCreate中初始化

      private RefWatcher mRefWatcher;
      @Override
      public void onCreate() {
          super.onCreate();
          mRefWatcher = LeakCanary.install(this);
      }
      

      也可以使用RefWatcher去检查某个指定对象的泄露:

      refWatcher.watch(obj);
      
    • 在Debug模式下,当我们有某个对象内存泄露的时候,LeakCanary会显示一个通知,点击后可以查看更加详细的泄露信息。能定位到某个View造成的内存泄露。

猜你喜欢

转载自blog.csdn.net/a94721990/article/details/81051251