概念:內(nèi)存泄漏是指無用對象(不再使用的對象)持續(xù)占有內(nèi)存或無用對象的內(nèi)存得不到及時釋放,從而造成內(nèi)存空間的浪費稱為內(nèi)存泄漏。
單例
這種應(yīng)該屬于新手最容易出現(xiàn)的錯誤,因為類中會封裝一些需要用到Context的方法,于是想當然的就把Activity或者Activity的Context直接傳入,結(jié)果就是這個單例一持有傳入的Activity無法得到釋放.
public class Singleton { private Context mContext; private volatile static Singleton instance = null; private Singleton(Context mContext) { this.mContext = mContext; } public static Singleton getInstance(Context mContext) { if (instance == null) { synchronized (Singleton.class) { instance = new Singleton(mContext); } } return instance; } }
解決方案
- 傳入的Activity使用
mContext.getApplicationContext()
</br></br></br>
匿名內(nèi)部類
這是Java中方便又恐怖的一個地方。因為你不注意就可以導(dǎo)致內(nèi)存泄漏比如下面這個。首先內(nèi)部有一個100秒的延遲操作,同時這個匿名內(nèi)部類最終指向是Activity導(dǎo)致finish后
GC依然認為它是有引用的所以導(dǎo)致無法回收。
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handler.postDelayed(runable,100000); } });
解決方案
- 匿名類改為靜態(tài)內(nèi)部類</br></br></br>
Handler Thread TimerTask
這種發(fā)生內(nèi)存泄漏問題與上面有類似之處比如:
handler.postDelayed(runable,100000);
一段延遲代碼讓Activity的任務(wù)沒有結(jié)束結(jié)果無法回收
解決方案
- 在Destory中記得賦為null或停止任務(wù)并且使用靜態(tài)修飾</br></br></br>
集合類、靜態(tài)集合類
使用集合類最容易長期持有對象,如果不對集合Remove或者Clear則會持有到集合的生命周期結(jié)束。
解決方案
- 及時的remove 和 clear</br></br></br>
監(jiān)聽器、各種連接、注冊 及解決
有些監(jiān)聽器生命周期很長。?需要remove 當你不知道它生命周期時最簡單的看看有沒有刪除監(jiān)聽方法如果有就使用至少不會錯,一些連接比如數(shù)據(jù)庫沒有關(guān)閉也會造成泄漏,在finally中要記得關(guān)閉,注冊與解除一定是成對出現(xiàn)的記住這個就夠了