原文連結:送一個記憶體洩漏給2016的記幾
背景
年底了,看公司專案的友盟的bug列表,發現java.lang.OutOfMemoryError的問題不少,也該是時候還了。
問題描述
在解決記憶體洩漏的過程中,遇到一個靜態變數導致的記憶體洩漏,關鍵是這程式碼還是自己敲的,明明已經使用弱引用,為什麼還是記憶體洩漏了。看程式碼:
public class RtHttp {
public static RtHttp instance = new RtHttp();
public Context context;
public static void with(Context context){
WeakReference<Context> wrContext = new WeakReference<Context>(context);
instance.context = wrContext.get();
}
}複製程式碼
RtHttp為封裝客戶端網路框架請求的入口,假設兩個條件:
- 其中傳入的Context物件只能是Activity,不能使用context.getApplicationContext()(因為此RtHttp還封裝了顯示網路載入對話方塊的程式碼)。
- 不能在Activity onDestroy()方法中呼叫RtHttp.instance.context = null;
已經使用了弱引用,為什麼還是記憶體洩漏呢?
記幾想不通,還到谷歌搜尋使用弱引用依然記憶體洩漏,WeakReference useless,無果。
如果你已經看出問題了,請直接到評論吐槽。
如果你沒看出問題,請把引用的文章看一遍。
總結
一個記憶體洩漏的問題,反映了Java基礎不牢固,在學習知識和解決問題上也不夠深入。一直想寫一篇2016的總結,希望以此記憶體洩漏的問題為界,實現在2017的一個技術提升。
引用
Android 記憶體洩漏總結
Java記憶體、Android 記憶體洩漏
Java gc(垃圾回收機制)小結,以及Android優化建議
JVM GC垃圾回收機制