“強引用、軟引用、弱引用、虛引用有什麼區別?” 這個問題難倒了很多資深Java工程師,不是因為這個問題本身有多難。 而是確實它是一個比較小眾的知識點。 大家好,我是Mic,一個工作了14年的Java程式員。 今天給大家分享一下這道面試題的標準回答。 文字版本我整理到了一個15W字的面試文檔裡面,大家 ...
“強引用、軟引用、弱引用、虛引用有什麼區別?”
這個問題難倒了很多資深Java工程師,不是因為這個問題本身有多難。
而是確實它是一個比較小眾的知識點。
大家好,我是Mic,一個工作了14年的Java程式員。
今天給大家分享一下這道面試題的標準回答。
文字版本我整理到了一個15W字的面試文檔裡面,大家可以私信我領取
下麵看看高手的回答。
高手:
不同的引用類型,主要體現的是對象不同的可達性狀態和對垃圾收集的影響。
強引用,就是普通對象的引用,只要還有強引用指向一個對象,就能表示對象還“活著”,垃圾收集器無法回收這一類對象。
只有在沒有其他引用關係,或者超過了引用的作用域,再或者顯示的把引用賦值為null的時候,垃圾回收器才能進行記憶體回收。
軟引用,是一種相對強引用弱化一些的引用,可以讓對象豁免一些垃圾收集,只有當 JVM 認為記憶體不足時,才會去試圖回收軟引用指向的對象。
軟引用通常用來實現記憶體敏感的緩存,如果還有空閑記憶體,就可以暫時保留緩存,當記憶體不足時清理掉,這樣就保證了使用緩存的同時,不會耗盡記憶體。
弱引用,相對強引用而言,它允許在存在引用關聯的情況下被垃圾回收的對象在垃圾回收器線程掃描它所管轄的記憶體區域的過程中,一旦發現了只具有弱引用的對象,不管當前記憶體空間足夠與否,垃圾回收期都會回收該記憶體虛引用,它不會決定對象的生命周期,它提供了一種確保對象被finalize以後,去做某些事情的機制。
當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的記憶體之前,把這個虛引用加入到與之關聯的引用隊列中。
程式可以通過判斷引用隊列中是否已經加入了虛引用,來瞭解被引用的對象是否將要進行垃圾回收,然後我們就可以在引用的對象的記憶體回收之前採取必要的行動。
總結
這是一個好問題,它整體涉及到的知識點,如果要深度挖掘。
還可以往對象的可達性狀態分析以及GC的回收原理進行展開。
不過確實也是一個比較偏門的問題,更多會應用在一些類庫或者框架裡面。
有興趣的小伙伴可以跟進一步去深度研究。
大家記得點贊、收藏加關註。
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自
Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!