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