Android内存泄漏缘由

这段时间调试APP的时候,发现程序在加载了过多的bitmap后会崩溃。查看了日志,原来是发生了内存溢出(OOM)。第一次遇到这样的问题,那就慢慢排查吧。html

内存优化能够参考胡凯大神的博客Android内存优化之OOMandroid

内存泄漏的缘由在Android 内存泄漏总结里介绍的很详细了,主要有如下几个方面git

  • 集合类泄漏
  • 单例形成的内存泄漏
  • 匿名内部类/非静态内部类和异步线程
  • Handler 形成的内存泄漏
  • 尽可能避免使用 static 成员变量
  • 避免 override finalize()
  • 资源未关闭形成的内存泄漏
  • 一些不良代码形成的内存压力

而内存泄露的分析工具,在这篇文章里也介绍了不少,好比MAT(Memory Analysis Tools)。可是最方便的仍是LeakCanarygithub

关于LeakCanary的使用方法,能够参考使用LeakCanary检测安卓中的内存泄漏(实战)。只须要在Gradle里集成,在application里初始化就好了。注意Gradle引用时是区分release和debug版本的。性能优化

集成后发现,原来是AsyncTask的不正确使用致使了内存泄漏,主要就是由于开发者文档里面用的就是用非静态内部类,这个非静态内部类会隐式地持有外部类的引用,若是其生命周期大于外部activity的生命周期,就有可能致使内存泄漏。app

解决方法能够参考如下博客Android内存泄漏-AsyncTask的不正确使用Android内存泄露之ThreadAndroid性能优化之常见的内存泄漏。在内部内中,对外部的activity作一个弱引用,固然在Activity销毁时候也应该取消相应的任务AsyncTask::cancel(),避免任务在后台执行浪费资源.异步