在Java中,參考類型包括有:1、強引用(StrongReference);2、軟引用(SoftRefernce);3、弱引用(WeakReference);4、虛引用(PhantomReference)。
Java的參考類型
#Java類型一般有兩種,即基本資料型別與引用資料型別。其中,引用資料型別在儲存堆中對需要引用的物件進行引用,引用是Java物件導向的特性。
從JDK1.2開始,Java中的引用型別分為四種,分別是:
①強引用(StrongReference)
②軟引用(SoftRefernce)
③弱引用(WeakReference)
④虛引用(PhantomReference)
強引用-StrongReference
#這種引用是平時開發中最常用的,例如Stringstrong=newString("StrongReference"),當一個實例對象具有強引用時,垃圾回收器不會回收該對象,當內存不足時,寧願拋出OutOfMemeryError異常也不會通過回收強引用的對象,因為JVM認為強引用的對像是使用者正在使用的對象,它無法分辨到底該回收哪一個,而強行回收有可能導致系統嚴重錯誤。
軟引用-SoftReference
如果一個物件只有軟引用,那麼只有當記憶體不足時,JVM才會去回收該對象,其他情況不會回收。軟引用可以結合ReferenceQueue來使用,當由於系統記憶體不足,導致軟引用的物件被回收了,JVM會把這個軟引用加入到與之相關聯的ReferenceQueue。
ReferenceQueuereferenceQueue=newReferenceQueue(); SoftReference<Book>softReference=newSoftReference<>(newBook(),referenceQueue); Bookbook=softReference.get(); Referencereference=referenceQueue.poll();
當系統記憶體不足時,觸發gc,這個Book就會被回收,reference將不為null。
弱引用-WeakReference
只有弱引用的對象,當JVM觸發gc時,就會回收該物件。與軟引用不同的是,不管是否記憶體不足,弱引用都會被回收。弱引用可以結合ReferenceQueue來使用,當由於系統觸發gc,導致軟引用的物件被回收了,JVM會把這個弱引用加入到與之相關聯的ReferenceQueue中,不過由於垃圾收集器執行緒的優先權很低,所以弱引用不一定會很快回收。下面透過一個主動觸發gc的例子來驗證此結論。
ReferenceQueuereferenceQueue=newReferenceQueue(); WeakReference<Book>weakReference=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與之關聯還有什麼存在的價值呢?
PhantomReference<Book>phantomReference=newPhantomReference<>(newBook(),referenceQueue); Bookbook=phantomReference.get();//此值为null Referencereference=referenceQueue.poll();
推薦教學:《java教學》
以上是Java引用型別包含哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!