Android 内存泄漏原因总结
-
单例模式持有 Context 对象:由于单例的静态特性使得单例的生命周期和应用的生命周期一样长,如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,这就导致了内存泄漏。
-
非静态内部类创建的静态成员变量持有 Context 对象:因为非静态内部类默认会持有外部类的引用,而它作为外部类的静态成员变量时,会永远持有外部类对象,与整个应用生命周期一样长。典型的就是 Activity 的内部类持有了当前 Activity 的实例,而这个类有一个静态成员变量的声明,这种情况需要在
onDestroy
方法中清空静态成员变量为null
。 -
非静态内部类默认持有外部类的引用:包括匿名内部类,当非静态内部类对象的生命周期比外部类对象的生命周期长时,就会导致内存泄漏,如
Handler
、Thread
、AsyncTask
等,应该使用静态Handler
类+弱引用weakReference
持有外部类对象 -
Handler 造成的内存泄漏:生命周期长度不一样,匿名内部类会持有外部类的引用,
Activity
页面关闭了,Handler
中的消息队列还有消息在跑,应该使用WeakReference
弱引用