日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WeakReference带来了什么

發布時間:2023/12/19 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,不靠譜。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的WeakReference带来了什么的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。