Hi, 我是Mic。 今天分享一道一線互聯網公司必問的面試題。 ”JVM如何判斷一個對象可以被回收“ 關於這個問題,來看看普通人和高手的回答。 普通人: 嗯。。。。。。。。。。 高手: 好的,面試官。 在JVM裡面,要判斷一個對象是否可以被回收,最重要的是判斷這個對象是否還在被使用,只有沒被使用的對 ...
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帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!