Java2增強了記憶體管理功能, 增加了一個java.lang.ref包,其中定義了三種引用類。這三種引用類分別為SoftReference、WeakReference和 PhantomReference.通過使用這些引用類,程式員可以在一定程度與GC進行互動,以便改善GC的工作效率。這些引用類的引用強度介於可達對 象和不可達對象之間。
建立一個引用對象也非常容易,例如如果你需要建立一個Soft Reference對象,那麼首先建立一個對象,並採用普通引用方式(可達對象);然後再建立一個SoftReference引用該對象;最後將普通引用 設定為null.通過這種方式,這個對象就只有一個Soft Reference引用。同時,我們稱這個對象為Soft Reference 對象。
Soft Reference的主要特點是據有較強的引用功能。只有當記憶體不夠的時候,才進行回收這類記憶體,因此在記憶體足夠的時候,它們通常不被回收。另外,這些引 用對象還能保證在Java拋出OutOfMemory 異常之前,被設定為null.它可以用於實現一些常用圖片的緩衝,實現Cache的功能,保證最大限度的使用記憶體而不引起OutOfMemory.以下給 出這種參考型別的使用虛擬碼;
//申請一個映像對象
Image image=new Image();//建立Image對象
…
//使用 image
…
//使用完了image,將它設定為soft 參考型別,並且釋放強引用;
SoftReference sr=new SoftReference(image);
image=null;
…
//下次使用時
if (sr!=null) image=sr.get();
else{
//由於GC由於低記憶體,已釋放image,因此需要重新裝載;
image=new Image();
sr=new SoftReference(image);
}
Weak引用對象與Soft引用對象的最大不同就在於:GC在進行回收時,需要通過演算法檢查是否回收Soft引用對象,而對於Weak引用對象,GC 總是進行回收。Weak引用對象更容易、更快被GC回收。雖然,GC在運行時一定回收Weak對象,但是複雜關係的Weak對象群常常需要好幾次GC的運 行才能完成。Weak引用對象常常用於Map結構中,引用資料量較大的對象,一旦該對象的強引用為null時,GC能夠快速地回收該對象空間。
Phantom引用的用途較少,主要用於輔助finalize函數的使用。Phantom對象指一些對象,它們執行完了finalize函數, 並為不可達對象,但是它們還沒有被GC回收。這種對象可以輔助finalize進行一些後期的回收工作,我們通過覆蓋Reference的clear() 方法,增強資源回收機制的靈活性。