一状囱、概念
在Java語言中涉馅,由JVM進行內(nèi)存的管理授账,JVM通過一定的內(nèi)存回收機制來管理內(nèi)存枯跑,對系統(tǒng)不再使用但JVM又無法回收的內(nèi)存我們稱為內(nèi)存泄漏(Memory Leak),內(nèi)存泄漏導(dǎo)致的結(jié)果就是內(nèi)存溢出(Out Of Memory)白热。而造成內(nèi)存泄漏的原因之一就是在應(yīng)用中不再使用的對象在其他地方被引用敛助,從而使JVM認為該內(nèi)存不能被回收,進而造成應(yīng)用使用的內(nèi)存達到系統(tǒng)分配的最大值而造成內(nèi)存溢出屋确∧苫鳎基于此,我們有必要了解一下Java語言中的引用類型攻臀。
二焕数、分類
Java語言的引用類型分為四種,從JVM回收的優(yōu)先級從低到高依次為:強引用刨啸、軟引用堡赔、弱引用和虛引用。這四種引用均定義在java.lang.ref包下设联。
1.強引用(Final Reference)
強引用在我們的程序代碼中普遍存在善已,形如Object obj = new Object();引用obj便屬于此類的引用。強引用具備以下三個特點:
- 強引用可以直接訪問目標(biāo)對象离例;
- 強引用指向的對象在任何時候都不會被系統(tǒng)回收换团。即只要強引用還存在,JVM永遠不會回收被強引用引用的對象宫蛆,JVM寧愿拋出OOM異常也不回收強引用所指向的對象艘包;
- 基于第二個特性,強應(yīng)用可能導(dǎo)致內(nèi)存泄露耀盗。
2.軟引用(Soft Reference)
軟引用用來描述一些還有用但并非必須的對象辑甜,軟引用具有如下特點:
- 對于軟引用關(guān)聯(lián)著的對象,在內(nèi)存充足的情況下袍冷,垃圾回收器不會回收此類對象磷醋,如果內(nèi)存不足,才會回收這些對象的內(nèi)存胡诗。
- 系統(tǒng)將會在發(fā)生內(nèi)存溢出之前邓线,將會把弱引用關(guān)聯(lián)著的對象列進回收范圍進行二次回收淌友。
- 軟引用主要應(yīng)用于內(nèi)存敏感的高速緩存,Android應(yīng)用中應(yīng)用比較廣泛骇陈,Android應(yīng)用中會用到大量的默認圖片震庭,可以通過軟引用來實現(xiàn)默認圖片的內(nèi)存讀取,實現(xiàn)圖片的緩存你雌,從而圖片的顯示速度器联。
3.弱引用(Weak Reference)
弱引用用來描述非必須的對象,強度比軟引用更弱一些婿崭,弱引用具有如下特點:
- 被弱引用關(guān)聯(lián)著的對象拨拓,只能生存到下一次垃圾回收之前。
- 當(dāng)垃圾收集器工作時氓栈,無論當(dāng)前內(nèi)存是否足夠渣磷,都會回收掉只被弱引用關(guān)聯(lián)的對象。一旦一個弱引用對象被垃圾回收器回收授瘦,便會加入到一個注冊引用隊列中醋界。此時再試圖通過weakRef.get()獲取對象的引用就會失敗。弱引用的相關(guān)實際案例可以參考WeakHashMap提完,具體使用參見源碼形纺。
4.虛引用(Phantom Reference)
虛引用也稱為幽靈引用或者幻影引用,它是最弱的一種引用關(guān)系徒欣。虛引用具有如下特點:
- 一個持有虛引用的對象逐样,和沒有引用幾乎是一樣的,隨時都有可能被垃圾回收器回收帚称。
- 當(dāng)試圖通過虛引用的get()方法取得強引用時,總是會失敗秽澳。并且闯睹,虛引用必須和引用隊列一起使用,它的作用在于跟蹤垃圾回收過程担神。虛引用的get方法實現(xiàn)如下:
public T get() {
return null;
}
可以看到永遠返回null;
- 虛引用的最大作用在于跟蹤對象回收楼吃,清理被銷毀對象的相關(guān)資源。