1. 程式人生 > >判斷物件存活:可達性分析演算法

判斷物件存活:可達性分析演算法

判斷物件存活,常用的方式是引用計數器:每當物件被一個地方引用,計數器便+1;當引用失效時,計數器-1。當物件的計數器為0時,該物件便是一個不被使用的物件,即“死亡”。

引用計數器實現簡單,效率高。然而難以解決物件之間相互迴圈引用的問題(兩個失效物件相互儲存了對方的指標)。故JVM判定物件是否存活,並沒有使用引用計數器,而是使用可達性分析演算法。

可達性分析演算法即:有一系列“GCRoots”起點,從這些點開始向下搜尋,走過的路徑稱為“引用鏈”。若一個物件沒有任何引用鏈可到達GC Roots,那麼該物件就是不可用的,即使該物件還與其他物件相關聯。

可作為GC Roots的物件包含:

①   虛擬機器棧中引用的物件

②   方法區中類靜態屬性引用的物件

③   方法區中常量引用的物件

④   本地方法棧中引用的物件

經可達性分析演算法所標記出的物件,會進行一次篩選(根據finalize方法)。若經過篩選,判定可回收,那麼就會立即回收;若判定沒有必要回收,那麼就將物件放入F-Queue佇列中,進行二次篩查。

二次篩查會執行物件的finalize()方法。若物件在這個過程重新與引用鏈上的任何一個物件建立關聯,那麼該物件就會從回收集合中移除。否則,物件會被回收。