java中提供了4個級別的引用:強引用、軟引用、弱引用和虛引用。這4個引用在java.lang.ref包下:。java
1、強引用
強引用在程序代碼這是廣泛存在的,相似Object o = new Object()這類的引用,只要強引用還存在,垃圾回收集器永遠不會回收被引用的對象。緩存
強引用具有如下三個特色:
一、強引用能夠直接訪問目標對象。對象
二、強引用鎖指向的對象任什麼時候候都不會被系統回收。JVM寧願拋出OOM(OutOfMemory)異常也不回收強引用所指向的對象。
三、強引用可能致使內存泄漏。隊列
2、軟引用
用來描述一類還有用但並不是必須的對象。對於軟引用關聯着的對象,在系統將要發生內存溢出異常以前,將會把這些對象列進回收範圍之中進行第二次回收。若是此次回收尚未足夠的內存,纔會拋出內存溢出異常。內存
對於軟引用關聯着的對象,若是內存充足,則垃圾回收器不會回收這些對象的內存,若是內存不足,則這些對象的內存被回收。在JDK1.2以後,提供了SoftReference類來實現軟引用。軟引用能夠用來實現內存敏感的高速緩存。軟引用能夠和一個引用隊列(ReferenceQueue)聯合使用,若是軟引用所引用的對象被垃圾回收器回收,java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。資源
3、弱引用(WeakReference)
用來描述非必須的對象,可是它的強度比軟引用更弱一些,被弱引用關聯的對象只能生存到下一次垃圾收集發送以前。當垃圾收集器工做時,不管當前內存是否足夠,都會回收掉只被弱引用關聯的對象。一旦一個弱引用對象被垃圾回收器回收,便會加入到一個註冊引用隊列中。 get
軟引用、弱引用都很是適合來保存那些無關緊要的緩存數據。若是這麼作,當系統內存不足時,這些緩存數據會被回收,不會致使內存溢出。而當內存資源充足時,這些緩存數據又能夠存在至關長的時間,從而起來加速系統的做用。虛擬機
4、虛引用(PhantomReference)
虛引用也稱爲幽靈引用或者幻影引用,它是最弱的一種引用關係。一個持有虛引用的對象,和沒有引用幾乎是同樣的,隨時都有可能被垃圾回收器回收。當試圖經過虛引用的get()方法取得強引用時,老是會失敗。而且,虛引用必須和引用隊列一塊兒使用,它的做用在於跟蹤垃圾回收過程。
虛引用的最大做用在於跟蹤對象回收,清理被銷燬對象的相關資源。 內存泄漏