看到篇帖子
, 國外一個技術面試官在面試senior java developer的時候, 問到一個weak reference相關的問題. 他沒有指望有人可以完整解釋清楚weak reference是什麼, 怎麼用, 只是指望有人可以提到這個concept和java的GC相關. 很惋惜的是, 20多個擁有5年以上java開發經驗的面試者中, 只有兩人知道weak reference的存在, 而其中只有一人實際用到過他. 無疑, 在interviewer眼中, 對於weak reference的理解和應用在面試中給了這一個interviewee至關多的加分. 因此, 將我對於這個技術的理解和使用總結在這篇博客裏, 但願讀者和本身經過讀和寫這篇帖子, 可以在之後的工做和麪試中得到加分.
在
Java裏, 當一個對象o被建立時, 它被放在Heap裏. 當GC運行的時候, 若是發現沒有任何引用指向o, o就會被回收以騰出內存空間. 或者換句話說, 一個對象被回收, 必須知足兩個條件: 1)沒有任何引用指向它 2)GC被運行.
在現實狀況寫代碼的時候
, 咱們每每經過把全部指向某個對象的referece置空來保證這個對象在下次GC運行的時候被回收 (能夠用java -verbose:gc來觀察gc的行爲)
Object c = new Car();java
c=null;程序員
可是
, 手動置空對象對於程序員來講, 是一件繁瑣且違背自動回收的理念的. 對於簡單的狀況, 手動置空是不須要程序員來作的, 由於在java中, 對於簡單對象, 當調用它的方法執行完畢後, 指向它的引用會被從stack中popup, 因此他就能在下一次GC執行時被回收了.
可是
, 也有特殊例外. 當使用cache的時候, 因爲cache的對象正是程序運行須要的, 那麼只要程序正在運行, cache中的引用就不會被GC給(或者說, cache中的reference擁有了和主程序同樣的life cycle). 那麼隨着cache中的reference愈來愈多, GC沒法回收的object也愈來愈多, 沒法被自動回收. 當這些object須要被回收時, 回收這些object的任務只有交給程序編寫者了. 然而這卻違背了GC的本質(自動回收能夠回收的objects).
因此
, java中引入了weak reference. 相對於前面舉例中的strong reference:
Object c = new Car(); //只要c還指向car object, car object就不會被回收面試
當一個對象僅僅被
weak reference指向, 而沒有任何其餘strong reference指向的時候, 若是GC運行, 那麼這個對象就會被回收. weak reference的語法是:
WeakReference<Car> weakCar = new WeakReference(Car)(car);對象
當要得到
weak reference引用的object時, 首先須要判斷它是否已經被回收:
weakCar.get();內存
若是此方法爲空
, 那麼說明weakCar指向的對象已經被回收了.