強(qiáng)引用
只要引用存在,垃圾回收器永遠(yuǎn)不會(huì)回收
Object obj = new Object();
//可直接通過(guò)obj取得對(duì)應(yīng)的對(duì)象 如obj.equels(new Object());
而這樣 obj對(duì)象對(duì)后面new Object的一個(gè)強(qiáng)引用誉裆,只有當(dāng)obj這個(gè)引用被釋放之后顿颅,對(duì)象才會(huì)被釋放掉,這也是我們經(jīng)常所用到的編碼形式足丢。
軟引用
非必須引用粱腻,內(nèi)存溢出之前進(jìn)行回收,可以通過(guò)以下代碼實(shí)現(xiàn)
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有時(shí)候會(huì)返回null
這時(shí)候sf是對(duì)obj的一個(gè)軟引用斩跌,通過(guò)sf.get()方法可以取到這個(gè)對(duì)象绍些,當(dāng)然,當(dāng)這個(gè)對(duì)象被標(biāo)記為需要回收的對(duì)象時(shí)耀鸦,則返回null柬批;
軟引用主要用戶實(shí)現(xiàn)類似緩存的功能,在內(nèi)存足夠的情況下直接通過(guò)軟引用取值袖订,無(wú)需從繁忙的真實(shí)來(lái)源查詢數(shù)據(jù)氮帐,提升速度;當(dāng)內(nèi)存不足時(shí)洛姑,自動(dòng)刪除這部分緩存數(shù)據(jù)上沐,從真正的來(lái)源查詢這些數(shù)據(jù)。
弱引用
第二次垃圾回收時(shí)回收楞艾,可以通過(guò)如下代碼實(shí)現(xiàn)
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();//有時(shí)候會(huì)返回null
wf.isEnQueued();//返回是否被垃圾回收器標(biāo)記為即將回收的垃圾
弱引用是在第二次垃圾回收時(shí)回收参咙,短時(shí)間內(nèi)通過(guò)弱引用取對(duì)應(yīng)的數(shù)據(jù),可以取到产徊,當(dāng)執(zhí)行過(guò)第二次垃圾回收時(shí)昂勒,將返回null。
弱引用主要用于監(jiān)控對(duì)象是否已經(jīng)被垃圾回收器標(biāo)記為即將回收的垃圾舟铜,可以通過(guò)弱引用的isEnQueued方法返回對(duì)象是否被垃圾回收器標(biāo)記戈盈。
虛引用
垃圾回收時(shí)回收,無(wú)法通過(guò)引用取到對(duì)象值,可以通過(guò)如下代碼實(shí)現(xiàn)
Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
pf.get();//永遠(yuǎn)返回null
pf.isEnQueued();//返回是否從內(nèi)存中已經(jīng)刪除
虛引用是每次垃圾回收的時(shí)候都會(huì)被回收塘娶,通過(guò)虛引用的get方法永遠(yuǎn)獲取到的數(shù)據(jù)為null归斤,因此也被成為幽靈引用。
虛引用主要用于檢測(cè)對(duì)象是否已經(jīng)從內(nèi)存中刪除刁岸。