好程序員Java學習路線分享Java弱引用的理解與使用,看到篇帖子, 國外一個技術面試官在面試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();
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指向的對象已經被回收了。java