首頁> Java> java教程> 主體

Java引用型別包含哪些?

青灯夜游
發布: 2020-07-25 11:52:25
原創
6867 人瀏覽過

在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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!