java 几种引用类型_Java 四种引用类型总结-Fun言
1. Java引用介紹
Java從1.2版本開始引入了4種引用,這4種引用的級(jí)別由高到低依次為:
強(qiáng)引用 ?> ?軟引用 ?> ?弱引用 ?> ?虛引用
⑴ 強(qiáng)引用(Strong Reference)
強(qiáng)引用是使用最普遍的引用,也是賦值的默認(rèn)引用。如果一個(gè)對(duì)象具有強(qiáng)引用,那垃圾回收器絕不會(huì)回收它。當(dāng)內(nèi)存空間不足,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來解決內(nèi)存不足的問題。
⑵ 軟引用(Soft Reference)
如果一個(gè)對(duì)象只具有軟引用,則內(nèi)存空間足夠,垃圾回收器就不會(huì)回收它;如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存。只要垃圾回收器沒有回收它,該對(duì)象就可以被程序使用。軟引用可用來實(shí)現(xiàn)內(nèi)存敏感的高速緩存。
軟引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用,如果軟引用所引用的對(duì)象被垃圾回收器回收,Java虛擬機(jī)就會(huì)把這個(gè)軟引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。
⑶ 弱引用(Weak Reference)
弱引用與軟引用的區(qū)別在于:只具有弱引用的對(duì)象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過程中,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存。不過,由于垃圾回收器是一個(gè)優(yōu)先級(jí)很低的線程,因此不一定會(huì)很快發(fā)現(xiàn)那些只具有弱引用的對(duì)象。
弱引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用,如果弱引用所引用的對(duì)象被垃圾回收,Java虛擬機(jī)就會(huì)把這個(gè)弱引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。
⑷ 虛引用(Phantom Reference)
“虛引用”顧名思義,就是形同虛設(shè),與其他幾種引用都不同,虛引用并不會(huì)決定對(duì)象的生命周期。如果一個(gè)對(duì)象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時(shí)候都可能被垃圾回收器回收。
虛引用主要用來跟蹤對(duì)象被垃圾回收器回收的活動(dòng)。虛引用與軟引用和弱引用的一個(gè)區(qū)別在于:虛引用必須和引用隊(duì)列 (ReferenceQueue)聯(lián)合使用。當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí),如果發(fā)現(xiàn)它還有虛引用,就會(huì)在回收對(duì)象的內(nèi)存之前,把這個(gè)虛引用加入到與之 關(guān)聯(lián)的引用隊(duì)列中。
四種引用回收情景
級(jí)別
什么時(shí)候被垃圾回收
用途
生存時(shí)間
強(qiáng)引用
從來不會(huì)
對(duì)象的一般狀態(tài)
JVM停止運(yùn)行時(shí)終止
軟引用
在內(nèi)存不足時(shí)
對(duì)象簡(jiǎn)單?緩存
內(nèi)存不足時(shí)終止
弱引用
在垃圾回收時(shí)
對(duì)象緩存
gc運(yùn)行后終止
虛引用
Unknown
Unknown
Unknown
Java?4 種引用使用場(chǎng)景
StrongReference、 SoftReference、 WeakReference、PhantomReference (傳說中的幽靈引用)
這 4 種類型的引用與 GC 有著密切的關(guān)系,?下面逐一來看它們的定義和使用場(chǎng)景 :
1. Strong Reference
StrongReference 是 Java 的默認(rèn)引用實(shí)現(xiàn),? 它會(huì)盡可能長(zhǎng)時(shí)間的存活于 JVM 內(nèi), 當(dāng)沒有任何對(duì)象指向它時(shí) GC 執(zhí)行后將會(huì)被回收
@Test
public?void?strongReference()?{
Object?referent?=?new?Object();
/**
*?通過賦值創(chuàng)建?StrongReference
*/
Object?strongReference?=?referent;
assertSame(referent,?strongReference);
referent?=?null;
System.gc();
/**
*?StrongReference?在?GC?后不會(huì)被回收
*/
assertNotNull(strongReference);
}
2. WeakReference & WeakHashMap
WeakReference,是一個(gè)弱引用,? 當(dāng)所引用的對(duì)象在 JVM 內(nèi)不再有強(qiáng)引用時(shí), GC 后 weak reference 將會(huì)被自動(dòng)回收
@Test
public?void?weakReference()?{
Object?referent?=?new?Object();
WeakReference?weakRerference?=?new?WeakReference(referent);
assertSame(referent,?weakRerference.get());
referent?=?null;
System.gc();
/**
*?一旦沒有指向?referent?的強(qiáng)引用,?weak?reference?在?GC?后會(huì)被自動(dòng)回收
*/
assertNull(weakRerference.get());
}
WeakHashMap 使用 WeakReference 作為 key
一旦沒有指向 key 的強(qiáng)引用, WeakHashMap 在 GC 后將自動(dòng)刪除相關(guān)的 entry
@Test
public?void?weakHashMap()?throws?InterruptedException?{
Map?weakHashMap?=?new?WeakHashMap();
Object?key?=?new?Object();
Object?value?=?new?Object();
weakHashMap.put(key,?value);
assertTrue(weakHashMap.containsValue(value));
key?=?null;
System.gc();
/**
*?等待無效?entries?進(jìn)入?ReferenceQueue?以便下一次調(diào)用?getTable?時(shí)被清理
*/
Thread.sleep(1000);
/**
*?一旦沒有指向?key?的強(qiáng)引用,?WeakHashMap?在?GC?后將自動(dòng)刪除相關(guān)的?entry
*/
assertFalse(weakHashMap.containsValue(value));
}
3. SoftReference
SoftReference 于 WeakReference 的特性基本一致, 最大的區(qū)別在于 SoftReference 會(huì)盡可能長(zhǎng)的保留引用直到 JVM 內(nèi)存不足時(shí)才會(huì)被回收(虛擬機(jī)保證), 這一特性使得 SoftReference 非常適合緩存應(yīng)用
@Test
public?void?softReference()?{
Object?referent?=?new?Object();
SoftReference?softRerference?=?new?SoftReference(referent);
assertNotNull(softRerference.get());
referent?=?null;
System.gc();
/**
*??soft?references?只有在?jvm?OutOfMemory?之前才會(huì)被回收,?所以它非常適合緩存應(yīng)用
*/
assertNotNull(softRerference.get());
}
參考推薦:
總結(jié)
以上是生活随笔為你收集整理的java 几种引用类型_Java 四种引用类型总结-Fun言的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸿蒙os开发小程序,9岁小学生展示鸿蒙O
- 下一篇: android10全局黑暗,传Andro