Android面試題——java中引用類型都有哪些

java中引用類型都有哪些

Java中對象的引用分爲四種級別,這四種級別由高到低依次爲:強引用、軟引用、弱引用和虛引用。

 強引用(StrongReference)

這個就不多說,我們寫代碼天天在用的就是強引用。如果一個對象被被人擁有強引用,那麼垃圾回收器絕不會回收它。當內存空間不足,Java虛擬機寧願拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足問題。

Java的對象是位於heap中的,heap中對象有強可及對象、軟可及對象、弱可及對象、虛可及對象和不可到達對象。應用的強弱順序是強、軟、弱、和虛。對於對象是屬於哪種可及的對象,由他的最強的引用決定。如下代碼:

String abc=newString("abc");  //1      

      SoftReference<String> softRef=newSoftReference<String>(abc);  //2      

      WeakReference<String> weakRef = newWeakReference<String>(abc); //3      

      abc=null; //4      

      softRef.clear();//5 

第一行在heap堆中創建內容爲“abc”的對象,並建立abc到該對象的強引用,該對象是強可及的。

第二行和第三行分別建立對heap中對象的軟引用和弱引用,此時heap中的abc對象已經有3個引用,顯然此時abc對象仍是強可及的。

第四行之後heap中對象不再是強可及的,變成軟可及的。

第五行執行之後變成弱可及的。

 軟引用(SoftReference)

如果一個對象只具有軟引用,那麼如果內存空間足夠,垃圾回收器就不會回收它,如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。

軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被垃圾回收,Java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。

軟引用是主要用於內存敏感的高速緩存。在jvm報告內存不足之前會清除所有的軟引用,這樣以來gc就有可能收集軟可及的對象,可能解決內存吃緊問題,避免內存溢出。什麼時候會被收集取決於gc的算法和gc運行時可用內存的大小。當gc決定要收集軟引用時執行以下過程,以上面的softRef爲例:

    1 首先將softRef的referent(abc)設置爲null,不再引用heap中的newString("abc")對象。

    2 將heap中的new String("abc")對象設置爲可結束的(finalizable)。

    3 當heap中的new String("abc")對象的finalize()方法被運行而且該對象佔用的內存被釋放, softRef被添加到它的ReferenceQueue(如果有的話)中。

   注意:對ReferenceQueue軟引用和弱引用可以有可無,但是虛引用必須有。

  被Soft Reference 指到的對象,即使沒有任何 Direct Reference,也不會被清除。一直要到 JVM 內存不足且沒有Direct Reference 時纔會清除,SoftReference 是用來設計 object-cache 之用的。如此一來 SoftReference 不但可以把對象 cache 起來,也不會造成內存不足的錯誤(OutOfMemoryError)。

 弱引用(WeakReference)

如果一個對象只具有弱引用,那該類就是可有可無的對象,因爲只要該對象被gc掃描到了隨時都會把它幹掉。弱引用與軟引用的區別在於:只具有弱引用的對象擁有更短暫的生命週期。在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由於垃圾回收器是一個優先級很低的線程,因此不一定會很快發現那些只具有弱引用的對象。

弱引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。

 虛引用(PhantomReference)

"虛引用"顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用並不會決定對象的生命週期。如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收。虛引用主要用來跟蹤對象被垃圾回收的活動。

虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用隊列(ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之關聯的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。程序如果發現某個虛引用已經被加入到引用隊列,那麼就可以在所引用的對象的內存被回收之前採取必要的行動。

建立虛引用之後通過get方法返回結果始終爲null,通過源代碼你會發現,虛引用通向會把引用的對象寫進referent,只是get方法返回結果爲null。先看一下和gc交互的過程再說一下他的作用。

  1 不把referent設置爲null, 直接把heap中的newString("abc")對象設置爲可結束的(finalizable)。

  2 與軟引用和弱引用不同, 先把PhantomRefrence對象添加到它的ReferenceQueue中.然後在釋放虛可及的對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章