单例
单例静态对象持有activity引用,且因静态对象生命周期比activity还长,当act被销毁时,单例中的activity无法回收,造成内存泄漏
解决方法:
传入的context使用 applicationContext进行重新赋值,application的生命周期与单例一样长
匿名内部类
原因:匿名内部类持有外部类引用
-
handler
创建匿名内部类handler,持有外部activity的引用,activity退出时,handler内部looper还在处理MessageQueue的消息,msg持有handler的引用,handler又持有activity的引用,造成内存泄漏解决方法:
建立静态的handler类,类内部可以创建activity的弱引用(静态内部类只能访问外部静态成员,因此便不会持有外部的act引用)
-
线程
new thread() 以及new Runnable() ,退出activity后,当子线程操作尚未完成时,会导致内存泄漏解决方法:
创建静态的内部类
非静态内部类
非静态内部类持有外部act引用,静态实例生命周期和应用一样长,act无法回收
解决方法:
使用静态内部类
static 修饰的成员变量
如果成员变量被声明为 static,其生命周期将与整个app进程生命周期一样。如果此变量持有activity的引用,则activity得不到释放
Stream未关闭
在调用了流之后,一定要记得关闭流。用到流的地方一般都是文件操作,虚拟机无法通过垃圾回收来释放这些资源。
使用资源没有及时释放
- brocastReceiver
- cursor
- bitmap
- BrocastReceiver
- file
- contentProvider
- Cursor
- stream
解决方法:
退出activity时,及时释放
常用的检测内存泄漏的工具
Leakcanary: Square 公司开源的「Android 和 Java 的内存泄漏检测库」
网友评论