天天看點

【JAVA】如何判斷對象已經死亡?                                          如何判斷對象已經死亡?

                                          如何判斷對象已經死亡?

JVM在進行垃圾回收時,要做的第一件事情,就是去尋找那些已經沒有任何變量引用的對象,進而對此類對象進行回收。那麼,JVM是如何判斷對象已經死亡了呢?

一、引用計數法

程式給對象添加一個引用計數器,每有一個變量引用它時,計數器加1。當引用斷開時,計數器減1。當計數器為0時,代表着沒有任何變量引用它,該對象就是死亡狀态,JVM需要對此類對象進行回收。

引用計數法的實作簡單,效率也很高。但絕大數主流的虛拟機并沒有采取此計數算法來管理記憶體,原因是此計數算法無法回收那些具有互相循環引用的對象,此類對象确實已經不再被使用,但由于互相引用着對方,導緻各自的計數器都不為0,是以JVM無法回收它們。

二、可達性分析法

程式建立一系列的GC Roots作為起始點,從這些節點開始向下搜尋,搜尋所走過的路徑稱為引用鍊,當一個對象與GC Roots沒有任何引用鍊相連的話,即此對象到GC Roots不可達,則證明此對象是不可用的,JVM稍後将會對此類對象進行回收。

大多數主流的JVM都采用這樣的算法來管理記憶體,它能夠解決對象之間的循環引用的問題。對象與對象之間雖然有循環引用,當他們到GC Roots沒有任何引用鍊,系統還是判定它們為可回收對象。

當通過這兩種方式确定對象已經沒有任何變量引用它們時,JVM将在合适的時機對此類對象進行回收。