常见的产生内存泄漏的情况如下所示:
- 持有静态的Context(Activity)引用。
- 持有静态的View引用,
- 内部类&匿名内部类实例无法释放(有延迟时间等等),而内部类又持有外部类的强引用,导致外部类无法释放,这种匿名内部类常见于监听器、Handler、Thread、TimerTask
- 资源使用完成后没有关闭,例如:BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap。
- 不正确的单例模式,比如单例持有Activity。
- 集合类内存泄漏,如果一个集合类是静态的(缓存HashMap),只有添加方法,没有对应的删除方法,会导致引用无法被释放,引发内存泄漏。
- 错误的覆写了finalize()方法,finalize()方法执行执行不确定,可能会导致引用无法被释放。
查找内存泄漏可以使用Android Profiler工具或者利用LeakCanary工具。我个人比较常用 LeakCanary工具,方便好用。
leakcannary github 地址。