強(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;軟引用主要用戶(hù)實(shí)現(xiàn)類(lèi)似緩存的功能,在內(nèi)存足夠的情況下直接通過(guò)軟引用取值,無(wú)需從繁忙的真實(shí)來(lái)源查詢(xún)數(shù)據(jù),提升速度;當(dāng)內(nèi)存不足時(shí),自動(dòng)刪除這部分緩存數(shù)據(jù),從真正的來(lái)源查詢(xún)這些數(shù)據(jù)。
弱引用:
第二次垃圾回收時(shí)回收,可以通過(guò)如下代碼實(shí)現(xiàn)Object obj = new Object();WeakReference<Object> wf = new WeakReference<Object>(obj);obj = null;wf.get();//有時(shí)候會(huì)返回nullwf.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)返回nullpf.isEnQueued();//返回是否從內(nèi)存中已經(jīng)刪除虛引用是每次垃圾回收的時(shí)候都會(huì)被回收,通過(guò)虛引用的get方法永遠(yuǎn)獲取到的數(shù)據(jù)為null,因此也被成為幽靈引用。虛引用主要用于檢測(cè)對(duì)象是否已經(jīng)從內(nèi)存中刪除。