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 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,939评论 25 708
  • 一、基础知识 1、什么是内存泄露 java中的内存泄露是指一个无用对象持续占有内存或无用对象的内存得不到及时的释放...
    LiveMoment阅读 4,443评论 0 20
  • 整理一些常见的Android面试题(针对于2~3年开发经验中所遇到的问题) synchronized锁静态方法和非...
    appzy阅读 2,347评论 4 18
  • ###集合类泄漏 集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。如果这个集合类是全局性的变...
    RunningTeemo阅读 581评论 0 0
  • 她看看手表坐在镜子前面半个小时的梳妆台这还是短的她看看手机开着微信抢一个红包整理了衣角不能有一点灰尘不能有一个褶皱...
    高华栋阅读 321评论 6 14