Android 常见的内存泄露场景(memory leak)

  1. 类的静态变量持有大数据对象、如Bitmap
    静态变量会长期维持对对象的引用,阻止垃圾回收

  2. 非静态内部类的静态实例
    非静态内部类会维持一个到外部内实例的引用,如果非静态内部类的实例是静态的就会间接长期维持着外部类的引用,阻止回收

  3. 资源对象未关闭,如Cursor File Socket等,这种情况应该在finally中关闭

  4. 注册对象未反注册
    未反注册会导致观察者列表里维持着对象的引用,阻止垃圾回收

  5. Handler临时性内存泄露
    Handler通过发送Message与主线程交互,Message发出之后是存储在MessageQueue中的,有些Message也不是马上就被处理的。在Message中存在一个 target,是Handler的一个引用,如果Message在Queue中存在的时间越长,就会导致Handler无法被回收。如果Handler是非静态的,则会导致Activity或者Service不会被回收。
    由于AsyncTask内部也是Handler机制,同样存在内存泄漏的风险。
    此种内存泄露,一般是临时性的。

  6. MVP模式中将activity作为view层被presenter层引用
    在这种场景中最好在activity onDestroy执行前将presenter中的View置空

预防
不要维持到Activity的长久引用,对activity的引用应该和activity本身有相同的生命周期。
尽量使用application context代替activity context
Activity中尽量不要使用非静态内部类和用WeakReference代替

检测
http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/
https://github.com/square/leakcanary

你可能感兴趣的:(Android 常见的内存泄露场景(memory leak))