編程中的死亡對象
- 2019 年 10 月 6 日
- 筆記
對象死亡
在之前的 Java記憶體區域文章中已經知道幾乎所有Java對象實例都存放在堆中,GC對堆進行回收之前先是判斷哪些對象已經「死亡」。那麼問題來了,怎麼樣確定一個對象是否已經死亡呢? 判斷對象是否已經死亡有引用計數演算法和可達性分析演算法
引用計數演算法(Reference Counting)
給對象中添加一個引用計數器,當每有一個地方應用它時,計數器值加1;當引用失效時,計數器值減1;任何時刻計數器為0的對象就是不可能被使用(死亡狀態)。這個計數演算法實現簡單,判斷效率也高,但是出現兩個實例相互引用並且沒有其他地方引用這兩個對象的情況,那麼這兩個對象實際上已經是死亡狀態,可是計算器的值不為0,存在誤判的,會導致記憶體溢出。哈哈,是不是覺得這個方法忽悠人的。
可達性分析演算法(Reachability Analysis)
現在jvm就是通過可達性分析來判斷對象是否存活的。基本思路是通過一系列稱為「GC Roots」的對象作為起始點,從這些點開始向下搜索,搜索所經過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,證明此對象是不可用的(死亡狀態)。如下圖:object 5、object 6、object 7雖然相互關聯,但是它們到GC Roots 是不可達的,所以它們被判斷為是可回收的對象。