【Java面試】JVM如何判斷一個物件可以被回收

跟著Mic學架構 發表於 2022-06-04
Java 面試 JVM

Hi, 我是Mic。

今天分享一道一線網際網路公司必問的面試題。

”JVM如何判斷一個物件可以被回收“

關於這個問題,來看看普通人和高手的回答。

普通人:

嗯。。。。。。。。。。

高手:

好的,面試官。

在JVM裡面,要判斷一個物件是否可以被回收,最重要的是判斷這個物件是否還在被使用,只有沒被使用的物件才能回收。

  1. 引用計數器,也就是為每一個物件新增一個引用計數器,用來統計指向當前物件的引用次數,

    如果當前物件存在應用的更新,那麼就對這個引用計數器進行增加,一旦這個引用計數器變成0,就意味著它可以被回收了。

    這種方法需要額外的空間來儲存引用計數器,但是它的實現很簡單,而且效率也比較高。

    image-20220423173852373

    不過主流的JVM都沒有采用這種方式,因為引用計數器在處理一些複雜的迴圈引用或者相互依賴的情況時,

    可能會出現一些不再使用但是又無法回收的記憶體,造成記憶體洩露的問題。

    image-20220423170255641

  2. 可達性分析,它的主要思想是,首先確定一系列肯定不能回收的物件作為GC root,

    比如虛擬機器棧裡面的引用物件、本地方法棧引用的物件等,然後以GC ROOT作為起始節點,

    從這些節點開始向下搜尋,去尋找它的直接和間接引用的物件,當遍歷完之後如果發現有一些物件不可到達,

    那麼就認為這些物件已經沒有用了,需要被回收。

    在垃圾回收的時候,JVM會首先找到所有的GC root,這個過程會暫停所有使用者執行緒,

    也就是stop the world,然後再從GC Roots這些根節點向下搜尋,可達的物件保留,不可達的就會回收掉。

    可達性分析是目前主流JVM使用的演算法。

    以上就是我對這個問題的理解。

    image-20220423172025944

總結

很多粉絲和我說,很多東西看完以後過一段時間就忘記了,問我是怎麼記下來的。

我和他說,技術這些東西不需要記,你唯一能做的就是減少碎片化的學習,多花一點時間在系統學習上,只有體系化的知識是不會忘記的。

可是,搭建體系化知識的過程要比碎片化的點狀學習痛苦不止一萬倍。

技術的沉澱是沒有捷徑的,只能花苦功夫去學習。

喜歡我的作品的小夥伴記得點贊和收藏。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!