送一個記憶體洩漏給 2016 的記幾

NEXT發表於2016-12-23

原文連結:送一個記憶體洩漏給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為封裝客戶端網路框架請求的入口,假設兩個條件:

  1. 其中傳入的Context物件只能是Activity,不能使用context.getApplicationContext()(因為此RtHttp還封裝了顯示網路載入對話方塊的程式碼)。
  2. 不能在Activity onDestroy()方法中呼叫RtHttp.instance.context = null;
    已經使用了弱引用,為什麼還是記憶體洩漏呢?

記幾想不通,還到谷歌搜尋使用弱引用依然記憶體洩漏WeakReference useless,無果。

送一個記憶體洩漏給 2016 的記幾
鄙視臉

如果你已經看出問題了,請直接到評論吐槽。
如果你沒看出問題,請把引用的文章看一遍。

總結

一個記憶體洩漏的問題,反映了Java基礎不牢固,在學習知識和解決問題上也不夠深入。一直想寫一篇2016的總結,希望以此記憶體洩漏的問題為界,實現在2017的一個技術提升。

引用

Android 記憶體洩漏總結
Java記憶體、Android 記憶體洩漏
Java gc(垃圾回收機制)小結,以及Android優化建議
JVM GC垃圾回收機制

相關文章