JavaTM 2 Platform
Standard Ed. 6

軟體套件 java.lang.ref

提供了參考物件類別,支持在某種程度上與垃圾回收器之間的交互。

請參見:
          描述

類別摘要
PhantomReference<T> 虛參考物件,在回收器確定其指示對象可另外回收之後,被加入佇列。
Reference<T> 參考物件的抽象基礎類別。
ReferenceQueue<T> 參考佇列,在檢測到適當的可到達性更改後,垃圾回收器將已註冊的參考物件添加到該佇列中。
SoftReference<T> 軟參考物件,在回應記憶體需要時,由垃圾回收器決定是否清除此物件。
WeakReference<T> 弱參考物件,它們並不禁止其指示物件變得可終結,並被終結,然後被回收。
 

軟體套件 java.lang.ref 的描述

提供了參考物件類別,支持在某種程度上與垃圾回收器之間的交互。程序可以使用一個參考物件來維持對另外某一物件的參考,所採用的方式是使後者仍然可以被回收器回收。程序還可以安排在回收器確定某一給定物件的可到達性已經更改之後的某個時間得到通知。

套件規範

參考物件 封裝了對另一個物件的參考,這樣就可以像其他任何物件一樣檢查和操作參考自身。有三種型別的參考物件,按從弱到強依次為: 參考、 參考和 參考。正如下面定義的那樣,每種型別對應於一個不同的可到達性級別。軟參考適用於實作記憶體敏感的快取記憶體,弱參考適用於實作無法防止其鍵(或值)被回收的規範化映射,而虛參考則適用於以某種比 Java 終結機制更靈活的方式排程 pre-mortem 清除操作。

每種參考物件型別都是通過抽象的基本 Reference 類別的一個子類別實作的。其中一個子類別的實例封裝了對特定物件的參考,該物件名為指示物件。每個參考對象都提供了獲取和清除該參考的方法。參考物件是不可變的,因此,除了清除操作之外,沒有提供 set 操作。通過添加任何所需的欄位和方法,程序可以為這些子類別進一步創建子類別,或者可以不加更改地使用這些子類別。

通知

在創建參考物件時,通過向參考佇列註冊 一個適當的參考物件,程序可以請求在對象可到達性更改時獲得通知。在垃圾回收器確定參考的可到達性已經更改為對應於參考型別的值之後的某一時間,它會將參考添加到相關的佇列中。此時,該參考被認為是已加入佇列的。通過輪詢或阻塞,直到獲得了參考,程序才可以從佇列中移除參考。參考佇列是通過 ReferenceQueue 類別實作的。

已註冊的參考對象及其佇列之間的關係是單向的。也就是說,佇列不會追蹤那些向它註冊的參考。如果一個已註冊的參考本身變得不可到達,則永遠不會將它加入到佇列中。使用參考物件的程序的責任是,確保物件是可達到的,只要程序對其指示物件感興趣。

雖然某些程序會選擇專門使用一個執行緒從一個或多個佇列中移除參考對象並處理它們,但這是絕對沒有必要的。一種通常很有用的策略是:在執行另一個相當頻繁的操作期間檢查參考佇列。例如,使用弱參考來實作弱鍵的雜湊表能在每次存取表時輪詢其參考佇列。這就是 WeakHashMap 類別的工作方式。因為 ReferenceQueue.poll 方法僅僅檢查內部資料結構,此檢查只為雜湊表存取方法增加了很小的系統開銷。

自動清除參考

在將軟參考和弱參考添加到向其註冊的佇列(如果有)之前,回收器將自動清除這些參考。所以,軟參考和弱參考不需要向佇列註冊即可使用,而虛參考則需要這樣做。通過虛參考可到達的物件將仍然保持原狀,直到清除所有這類別參考或者它們本身變得不可到達。

可到達性

從最強到最弱,不同的可到達性級別反映了物件的生命週期。在操作上,可將它們定義如下:

從以下版本開始:
1.2

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only