天天看點

WeakReference帶來了什麼

轉載自: WeakReference帶來了什麼

很多人說到:java存在記憶體洩漏。

我不想反駁,因為我也開始慢慢說了,但我知道:記憶體洩漏和規範編碼是兩個完全不同的概念,是以我想說:請規範編碼

java的“記憶體洩漏”:

堆記憶體不夠用了,為什麼不夠用了?因為你認為已經過時的東西,沒有被系統釋放掉記憶體,為什麼沒有釋放掉記憶體?

- 因為你沒有顯示釋放(c++版本)

- 因為你還擁有着該對象的引用,而該對象沒有被認為是垃圾(java版本)

是以,你的編碼并不規範

WeakReference和記憶體洩漏有什麼樣的關系?

好像,沒關系,那麼WeakReference又是什麼?

讓我們先描述一個問題:我有一個對象a(它非常的消耗記憶體,比如一個bitmap),當你同時申請了20個對象在android中,你将會看到out of memory異常,但是,如果你不緩存圖檔,那麼使用者将會認為你的app的性能非常差:當你的應用涉及到gridview,而每一個item都是一個圖檔時一個沖突:不加載圖檔(性能低下) vs 加載圖檔(加載多了,程式會挂)

一個解決方法:

隻加載有限的圖檔,如5個圖檔,是的,這能解決問題,但是,你要為此付出的是什麼:手動編寫加載政策,以及釋放政策。

WeakReference是什麼:

先不看官方doc,讓我們舉個例子:對象a非常的消耗記憶體,我有一個WeakReference對象(wra),并且和對象a關聯:(wra & a are good friends)那麼,在虛拟機看來是什麼樣子呢:wra對象不是個垃圾,但是和wra對象相關聯的對象(對象a)被認為是垃圾,是的,垃圾就是垃圾,但是:垃圾并不會立刻被清理,也就意味着:你仍然可以使用對象a,如果它還沒被清理的情況下,如果對象a已經被清理呢:你必須重新建構對象a,再一次和wra關聯。

那樣做有什麼樣的好處:

你将可以肆無忌憚的申請任意多個“非常消耗記憶體”的對象(前提是讓他們和WeakReference關聯)使用這些對象前,先判定他們有沒有被清理:

  • 如果是,重新建構該對象(可能重新建構并不繁瑣)
  • 如果不是,直接使用

總結:WeakReference負責了釋放政策

與WeakReference類似的還有:SoftReference,大同小異

事實,并不是,看上去很美

我曾經做過實驗,按照WeakReference的做法,編寫程式,在android2.2上,程式運作正常,但是,同一套代碼運作在android4.0上,程式崩潰:out of memory,正是為了避免OOM異常,我采用了WeakReference。

但是,WeakReference,不靠譜。