Android常見內(nèi)存泄漏及正確寫法(相對)

概念:內(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)的記住這個就夠了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 內(nèi)存泄漏總結(jié) 內(nèi)存管理的目的就是讓我們在開發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題。內(nèi)存泄漏...
    _痞子閱讀 1,654評論 0 8
  • Android 內(nèi)存泄漏總結(jié) 內(nèi)存管理的目的就是讓我們在開發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題。內(nèi)存泄漏...
    apkcore閱讀 1,237評論 2 7
  • 內(nèi)存管理的目的就是讓我們在開發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題。內(nèi)存泄漏大家都不陌生了,簡單粗俗的講,...
    DreamFish閱讀 802評論 0 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評論 25 708
  • ###集合類泄漏 集合類如果僅僅有添加元素的方法,而沒有相應(yīng)的刪除機制,導(dǎo)致內(nèi)存被占用。如果這個集合類是全局性的變...
    RunningTeemo閱讀 585評論 0 0