首頁  >  文章  >  Java  >  Java引用型別包含哪些?

Java引用型別包含哪些?

青灯夜游
青灯夜游原創
2020-07-25 11:52:256801瀏覽

在Java中,參考類型包括有:1、強引用(StrongReference);2、軟引用(SoftRefernce);3、弱引用(WeakReference);4、虛引用(PhantomReference)。

Java引用型別包含哪些?

Java的參考類型

#Java類型一般有兩種,即基本資料型別與引用資料型別。其中,引用資料型別在儲存堆中對需要引用的物件進行引用,引用是Java物件導向的特性。

從JDK1.2開始,Java中的引用型別分為四種,分別是:

①強引用(StrongReference)

②軟引用(SoftRefernce)

③弱引用(WeakReference)

④虛引用(PhantomReference)

強引用-StrongReference

#這種引用是平時開發中最常用的,例如Stringstrong=newString("StrongReference"),當一個實例對象具有強引用時,垃圾回收器不會回收該對象,當內存不足時,寧願拋出OutOfMemeryError異常也不會通過回收強引用的對象,因為JVM認為強引用的對像是使用者正在使用的對象,它無法分辨到底該回收哪一個,而強行回收有可能導致系統嚴重錯誤。

軟引用-SoftReference

如果一個物件只有軟引用,那麼只有當記憶體不足時,JVM才會去回收該對象,其他情況不會回收。軟引用可以結合ReferenceQueue來使用,當由於系統記憶體不足,導致軟引用的物件被回收了,JVM會把這個軟引用加入到與之相關聯的ReferenceQueue。

ReferenceQueuereferenceQueue=newReferenceQueue();
SoftReferencesoftReference=newSoftReference<>(newBook(),referenceQueue);
Bookbook=softReference.get();
Referencereference=referenceQueue.poll();

當系統記憶體不足時,觸發gc,這個Book就會被回收,reference將不為null。

弱引用-WeakReference

只有弱引用的對象,當JVM觸發gc時,就會回收該物件。與軟引用不同的是,不管是否記憶體不足,弱引用都會被回收。弱引用可以結合ReferenceQueue來使用,當由於系統觸發gc,導致軟引用的物件被回收了,JVM會把這個弱引用加入到與之相關聯的ReferenceQueue中,不過由於垃圾收集器執行緒的優先權很低,所以弱引用不一定會很快回收。下面透過一個主動觸發gc的例子來驗證此結論。

ReferenceQueuereferenceQueue=newReferenceQueue();
WeakReferenceweakReference=newWeakReference(newBook(),referenceQueue);
Bookbook=softReference.get();
System.gc();
//Runtime.getRuntime().gc();
Referencereference=referenceQueue.poll();

當然這不是每次都能復現,因為我們呼叫System.gc()只是告訴JVM該回收垃圾了,但是它什麼時候做還是不一定的,但就我測試來看,只要多寫幾次System.gc(),復現的機率還是很高的。

虛引用-PhantomReference

如果一個物件只有虛引用在引用它,垃圾回收器是可以在任何時候對其進行回收的,虛引用主要用來追蹤物件被垃圾回收器回收的活動,當被回收時,JVM會把這個弱引用加入到與之相關聯的ReferenceQueue。

與軟引用和弱引用不同的是,虛引用必須有一個與之關聯的ReferenceQueue,透過phantomReference.get()得到的值為null,試想一下,如果沒有ReferenceQueue與之關聯還有什麼存在的價值呢?

PhantomReferencephantomReference=newPhantomReference<>(newBook(),referenceQueue);
Bookbook=phantomReference.get();//此值为null
Referencereference=referenceQueue.poll();

推薦教學:《java教學

以上是Java引用型別包含哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn