好程式設計師Java學習路線分享Java弱引用的理解與使用
好程式設計師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指向的物件已經被回收了 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2658338/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java學習路線分享原生Ajax的使用程式設計師Java
- 好程式設計師Java學習路線分享SpringCloud程式設計師JavaSpringGCCloud
- 好程式設計師Java學習路線分享怎麼理解Java物件導向程式設計師Java物件
- 好程式設計師Java學習路線分享MyBatis之基本使用程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享Java中的位移運算程式設計師Java
- 好程式設計師Java學習路線分享Java框架怎麼搭建程式設計師Java框架
- 好程式設計師Java學習路線分享Java-String常用方法程式設計師Java
- 好程式設計師Java學習路線分享mybatis對映程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享finalize()方法詳解程式設計師Java
- 好程式設計師Java學習路線分享JVM相關概念程式設計師JavaJVM
- 好程式設計師Java學習路線分享MyBatis之Spring整合程式設計師JavaMyBatisSpring
- 好程式設計師Java學習路線分享Redis快速入門程式設計師JavaRedis
- 好程式設計師Java學習路線分享maven是什麼程式設計師JavaMaven
- 好程式設計師Java學習路線分享SpringMVC之MVC概述程式設計師JavaSpringMVC
- 好程式設計師Java學習路線分享Java案例-封裝JDBC工具類程式設計師Java封裝JDBC
- 好程式設計師Java學習路線之集程式設計師Java
- 好程式設計師Java學習路線JSP物件程式設計師JavaJS物件
- 好程式設計師Java學習路線分享三大特性之多型程式設計師Java多型
- 好程式設計師Java學習路線分享Dubbo架構介紹程式設計師Java架構
- 好程式設計師Java學習路線分享多執行緒概念程式設計師Java執行緒
- 好程式設計師Java學習路線分享MySQL目錄結構程式設計師JavaMySql
- 好程式設計師Java學習路線分享Spring建立Bean的3種方式程式設計師JavaSpringBean
- 好程式設計師Java學習路線分享JavaEE的13種核心技術程式設計師Java
- 好程式設計師Java學習路線分享SpringMVC之請求和響應程式設計師JavaSpringMVC
- 好程式設計師Java學習路線分享如何處理中文引數程式設計師Java
- 好程式設計師Java學習路線分享MyBatis之關聯查詢程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享JVM類載入機制程式設計師JavaJVM
- 好程式設計師Java學習路線分享Spring常見面試題程式設計師JavaSpring面試題
- 好程式設計師Java學習路線分享Java面試題之載入機制程式設計師Java面試題
- 好程式設計師Java教程分享如何系統的學習Java程式設計師Java
- 好程式設計師Java學習路線分享5分鐘瞭解計數排序程式設計師Java排序
- 好程式設計師Java學習路線分享實戰Tomcat效能最佳化程式設計師JavaTomcat
- 好程式設計師Java學習路線分享氣泡排序及最佳化程式設計師Java排序
- 好程式設計師Java學習路線分享JavaScript基本資料型別分析程式設計師JavaScript資料型別
- 好程式設計師Java學習路線分享java為什麼不支援泛型陣列程式設計師Java泛型陣列
- 好程式設計師Java學習路線Java bean是個什麼概念程式設計師JavaBean
- 好程式設計師告訴你Java架構師學習路線程式設計師Java架構
- 長沙Java培訓:後端程式設計師Java學習路線分享Java後端程式設計師