1. 程式人生 > 其它 >第四講 引用

第四講 引用

1.問題

強引用、軟引用、弱引用、幻象引用有什麼區別?具體使用場景是什麼?

2.回答

不同的引用型別,主要體現的是物件不同的可達性(reachable)狀態和對垃圾收集的影響。

所謂強引用(“Strong” Reference),就是我們最常見的普通物件引用,只要還有強引用指向一個物件,就能表明物件還“活著”,垃圾收集器不會碰這種物件。對於一個普通的物件,如果沒有其他的引用關係,只要超過了引用的作用域或者顯式地將相應(強)引用賦值為null,就是可以被垃圾收集的了,當然具體回收時機還是要看垃圾收集策略。

軟引用(SoftReference),是一種相對強引用弱化一些的引用,可以讓物件豁免一些垃圾收集,只有當JVM認為記憶體不足時,才會去試圖回收軟引用指向的物件。JVM會確保在丟擲OutOfMemoryError之前,清理軟引用指向的物件。軟引用通常用來實現記憶體敏感的快取,如果還有空閒記憶體,就可以暫時保留快取,當記憶體不足時清理掉,這樣就保證了使用快取的同時,不會耗盡記憶體。

弱引用(WeakReference)並不能使物件豁免垃圾收集,僅僅是提供一種訪問在弱引用狀態下物件的途徑。這就可以用來構建一種沒有特定約束的關係,比如,維護一種非強制性的對映關係,如果試圖獲取時物件還在,就使用它,否則重現例項化。它同樣是很多快取實現的選擇。

對於幻象引用,有時候也翻譯成虛引用,你不能通過它訪問物件。幻象引用僅僅是提供了一種確保物件被finalize以後,做某些事情的機制,比如,通常用來做所謂的Post-Mortem清理機制,我在專欄上一講中介紹的Java平臺自身Cleaner機制等,也有人利用幻象引用監控物件的建立和銷燬。