Android 内存泄漏原因总结

  • 单例模式持有 Context 对象:由于单例的静态特性使得单例的生命周期和应用的生命周期一样长,如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,这就导致了内存泄漏。

  • 非静态内部类创建的静态成员变量持有 Context 对象:因为非静态内部类默认会持有外部类的引用,而它作为外部类的静态成员变量时,会永远持有外部类对象,与整个应用生命周期一样长。典型的就是 Activity 的内部类持有了当前 Activity 的实例,而这个类有一个静态成员变量的声明,这种情况需要在onDestroy方法中清空静态成员变量为null

  • 非静态内部类默认持有外部类的引用:包括匿名内部类,当非静态内部类对象的生命周期比外部类对象的生命周期长时,就会导致内存泄漏,如HandlerThreadAsyncTask等,应该使用静态Handler类+弱引用weakReference持有外部类对象

  • Handler 造成的内存泄漏:生命周期长度不一样,匿名内部类会持有外部类的引用,Activity 页面关闭了,Handler 中的消息队列还有消息在跑,应该使用 WeakReference 弱引用

11-27 12:04