Hi, 我是Mic。
今天分享一道一線網際網路公司必問的面試題。
”JVM如何判斷一個物件可以被回收“
關於這個問題,來看看普通人和高手的回答。
普通人:
嗯。。。。。。。。。。
高手:
好的,面試官。
在JVM裡面,要判斷一個物件是否可以被回收,最重要的是判斷這個物件是否還在被使用,只有沒被使用的物件才能回收。
引用計數器,也就是為每一個物件新增一個引用計數器,用來統計指向當前物件的引用次數,
如果當前物件存在應用的更新,那麼就對這個引用計數器進行增加,一旦這個引用計數器變成0,就意味著它可以被回收了。
這種方法需要額外的空間來儲存引用計數器,但是它的實現很簡單,而且效率也比較高。
不過主流的JVM都沒有采用這種方式,因為引用計數器在處理一些複雜的迴圈引用或者相互依賴的情況時,
可能會出現一些不再使用但是又無法回收的記憶體,造成記憶體洩露的問題。
可達性分析,它的主要思想是,首先確定一系列肯定不能回收的物件作為GC root,
比如虛擬機器棧裡面的引用物件、本地方法棧引用的物件等,然後以GC ROOT作為起始節點,
從這些節點開始向下搜尋,去尋找它的直接和間接引用的物件,當遍歷完之後如果發現有一些物件不可到達,
那麼就認為這些物件已經沒有用了,需要被回收。
在垃圾回收的時候,JVM會首先找到所有的GC root,這個過程會暫停所有使用者執行緒,
也就是stop the world,然後再從GC Roots這些根節點向下搜尋,可達的物件保留,不可達的就會回收掉。
可達性分析是目前主流JVM使用的演算法。
以上就是我對這個問題的理解。
總結
很多粉絲和我說,很多東西看完以後過一段時間就忘記了,問我是怎麼記下來的。
我和他說,技術這些東西不需要記,你唯一能做的就是減少碎片化的學習,多花一點時間在系統學習上,只有體系化的知識是不會忘記的。
可是,搭建體系化知識的過程要比碎片化的點狀學習痛苦不止一萬倍。
技術的沉澱是沒有捷徑的,只能花苦功夫去學習。
喜歡我的作品的小夥伴記得點贊和收藏。
版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!