轉載自: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,不靠譜。