最初的 Java 引用
在 JDK 1.2 以前,Java 中的引用的定義很傳統︰如果 reference 類型的資料中存儲的數值代表的是另外一塊記憶體的起始位址,就稱這塊記憶體代表着一個引用。
這種定義很純粹,但是太過狹隘,一個對象在這種定義下隻有被引用或者沒有被引用兩種狀态,對于如何描述一些 “食之無味,棄之可惜” 的對象就顯得無能為力。
我們希望能描述這樣一類對象:當記憶體空間還足夠時,則能保留在記憶體之中;如果記憶體空間在進行垃圾收集後還是非常緊張,則可以抛棄這些對象。很多系統的緩存功能都符合這樣的應用場景。
JDK 1.2 後的 Java 引用
在 JDK 1.2 之後,Java對引用的概念進行了擴充,将引用分為強引用(Strong
Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(PhantomReference)四種,這四種引用強度依次逐漸減弱。
強引用
強引用就是指在程式代碼之中普逼存在的,類似 Object obj = new Object( ) 這類的引用,隻要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象。
軟引用
軟引用是用來描述一些還有用但并非必需的對象。對于軟引用關聯着的對象,在系統将要發生記憶體溢出異常之前,将會把這些對象列進回收範圍之中進行第二次回收。如果這次回收還沒有足夠的記憶體,才會抛出記憶體溢出異常。在 JDK 1.2 之後,提供了 SoftReference 類來實作軟引用。
弱引用
弱引用也是用來描述非必需對象的,但是它的強度比軟引用更弱一些,被弱引用關聯的對象隻能生存到下一次垃圾收集發生之前。當垃圾收集器工作時,無論目前記憶體是否足夠,都會回收掉隻被弱引用關聯的對象。在 JDK 1.2 之後,提供了 WeakReference 類來實作弱引用。
虛引用
虛引用也稱為幽靈引用或者幻影引用,它是最弱的一種引用關系。一個對象是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個對象執行個體。為一個對象設定虛引用關聯的唯一目的就是能在這個對象被收集器回收時收到一個系統通知。在 JDK 1.2 之後,提供了 PhantomReference 類來實作虛引用。