天天看點

java對象引用類型有哪幾種

引用類型

對象引用類型分為強引用、軟引用、弱引用和虛引用

1、強引用

就是我們一般聲明對象是時虛拟機生成的引用,強引用環境下,垃圾回收時需要嚴格判斷目前對象是否被強引用,如果被強引用,則不會被垃圾回收

2、軟引用

軟引用一般被做為緩存來使用。與強引用的差別是,軟引用在垃圾回收時,虛拟機會根據目前系統的剩餘記憶體來決定是否對軟引用進行回收。如果剩餘記憶體比較緊張,則虛拟機會回收軟引用所引用的空間;如果剩餘記憶體相對富裕,則不會進行回收。換句話說,虛拟機在發生OutOfMemory時,肯定是沒有軟引用存在的。

Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有時候會傳回null
           

這時候sf是對obj的一個軟引用,通過sf.get()方法可以取到這個對象,當然,當這個對象被标記為需要回收的對象時,則傳回null;

軟引用主要使用者實作類似緩存的功能,在記憶體足夠的情況下直接通過軟引用取值,無需從繁忙的真實來源查詢資料,提升速度;當記憶體不足時,自動删除這部分緩存資料,從真正的來源查詢這些資料。

3、弱引用

弱引用與軟引用類似,都是作為緩存來使用。但與軟引用不同,弱引用在進行垃圾回收時,是一定會被回收掉的,是以其生命周期隻存在于一個垃圾回收周期内。

弱引用是在第二次垃圾回收時回收,短時間内通過弱引用取對應的資料,可以取到,當執行過第二次垃圾回收時,将傳回null。

弱引用主要用于監控對象是否已經被垃圾回收器标記為即将回收的垃圾,可以通過弱引用的isEnQueued方法傳回對象是否被垃圾回收器标記。

Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();//有時候會傳回null
wf.isEnqueued();//傳回是否被垃圾回收器标記為即将回收的垃圾
           

4、虛引用

垃圾回收時回收,無法通過引用取到對象值

Object obj = new Object();
PhantomReference<Object> pf =new PhantomReference<>(obj,null);
obj=null;
pf.get();//永遠傳回null
pf.isEnqueued();//傳回是否從記憶體中已經删除
           

虛引用是每次垃圾回收的時候都會被回收,通過虛引用的get方法永遠擷取到的資料為null,是以也被成為幽靈引用。

虛引用主要用于檢測對象是否已經從記憶體中删除

總結

強引用不用說,我們系統一般在使用時都是用的強引用。而“軟引用”和“弱引用”比較少見。他們一般被作為緩存使用,而且一般是在記憶體大小比較受限的情況下做為緩存。因為如果記憶體足夠大的話,可以直接使用強引用作為緩存即可,同時可控性更高。因而,他們常見的是被使用在桌面應用系統的緩存。