1.单例模式导致泄漏
以Activity为例,启动一个Activity,并调用getInstance(Contextcontext)方法去获取AppSettings的单例,传入Activity.this作为context,这样AppSettings类的单例sInstance就持有了Activity的引用,当我们退出Activity时,该Activity就没有用了,但是因为sIntance作为静态单例(在应用程序的整个生命周期中存在)会继续持有这个Activity的引用,导致这个Activity对象无法被回收释放,这就造成了内存泄露。
使用全局context即可与单例生命周期长度相同,可避免内存泄漏
(使用application context即可)
2.静态变量导致泄漏
activity的静态成员生命周期比activity自身要长,当activity要退出后,静态成员若仍在引用,activity无法回收,造成泄露
减少静态变量的使用,或在合适时释放引用,避免泄漏
3.未取消注册或回调导致泄漏
注册的广播,在activity销毁时不取消注册,则会造成泄漏
startservice()同样
及时取消注册可避免泄漏
4.Timer和TimerTask造成泄漏
activity销毁时,timer可能还在继续执行timertask,无法回收activity的引用,造成泄漏
销毁activity时,及时cancle timer和timertask
5.资源未关闭或释放造成泄露
IO,File,Cursor,Sqlite的缓冲会造成泄漏,需要及时关闭
6.属性动画造成泄漏
销毁activity时要注意cancle掉属性动画(ObjectAnimator)
7.WebView造成泄露
销毁webview之前需要先从父容器中将其移除,然后销毁