首先,引用對象在Java定義中有三種類型,從弱到強依次爲:軟引用、弱引用與虛引用,三種級別也各有所不一樣(軟引用>弱引用)。本文淺析下軟引用與弱引用。大概的解釋,軟引用適合應用在須要cache的場景,通常面向實現內存敏感的緩存;弱引用則是適用在某些場景爲了沒法防止被回收的規範性映射,它優先級最低,通常與引用隊列聯合使用。算法
詳細介紹:
(一)強引用(默認存在)
強引用,是在實際開發中最爲廣泛的引用。有時候你開發的時候,申請一個內存空間的時候,就已是強引用了。例如:緩存
Object obj =new Object(); // 強引用
在強引用中,若是不讓該對象指向爲空,垃圾回收器絕對不會回收它。除非當出現內存空間不足的時候。jvm拋出oom致使程序異常種植的時候,纔會回收具備強引用的對象來解決內存空間不足問題。安全
Object obj =new Object(); // 強引用 obj = null;//這時候爲垃圾回收器回收這個對象,至於何時回收,取決於垃圾回收器的算法
(二)軟引用(SoftReference )
軟引用對象也比較好理解,它是一個比較特殊的存在,擁有強引用的屬性,又更加安全。若是有一個對象具備軟引用。在內存空間足夠的狀況下,除非內存空間接近臨界值、jvm即將拋出oom的時候,垃圾回收器纔會將該引用對象進行回收,避免了系統內存溢出的狀況。(前提也是對象指向不爲空)所以,SoftReference 引用對象很是適合實現內存敏感的緩存,例如加載圖片的時候,bitmap緩存機制。jvm
String value = new String(「sy」); SoftReference sfRefer = new SoftReference (value ); sfRefer .get();//能夠得到引用對象值
(三)弱引用(WeakReference)
顧名思義,一個具備弱引用的對象,與軟引用對比來講,前者的生命週期更短。當垃圾回收器掃描到弱引用的對象的時候,無論內存空間是否足夠,都會直接被垃圾回收器回收。不過也不用特別擔憂,垃圾回收器是一個優先級比較低的現場,所以不必定很快能夠發現弱引用的對象。
另外,google官方是推薦Android開發者使用WeakReference,而不建議SoftReference 引用,Android環境下與純Java有所略同。下面待會說明狀況。google
String value = new String(「sy」); WeakReference weakRefer = new WeakReference(value ); System.gc(); weakRefer.get();//null
參考文獻:https://www.jianshu.com/p/b56731447179spa