天天看點

【深入了解JVM】 判斷對象存活算法

概要

JVM 垃圾收集之前需要判斷哪些對象需要回收,下面介紹幾種常用的判斷對象是否存活算法。

引用計數法(Reference Counting)

顧名思義,引用計數法就是對引用進行計數,引用對象+1計數,引用失效時-1,當計數為0時,就是對象沒有被使用,可以被回收。

優點:實作簡單,并且判定效率也高。
缺點:無法解決互相引用的問題。目前沒有一款JVM采用此種算法。

例如 A 對象持有 B 對象的引用 B 對象持有 A 對象的 引用

這種情況下,這兩個對象都不會被引用計數法判定為0引用。

可達性分析算法(Reachability Analysis)

目前被各大語言廣泛應用的判斷對象存活算法。這個算法的基本思想就是通過一系列被成為 “GC ROOT” 的對象作為起始點,從這些節點開始向下搜尋,搜尋走過的路徑被稱之為引用鍊(Reference Chain),當一個對象到GC ROOT 沒有任何引用鍊性相連,則證明此對象是不可用的。

例如 E,F,G對象雖然存在互相引用,但是其與GC ROOT 沒有引用鍊的關系,即判定E,F,G為可回收對象

GC ROOT 對象包括

  1. 虛拟機棧中引用的對象
  2. 方法區中類靜态屬性引用的對象
  3. 方法區中常量引用的對象
  4. 本地方法棧中JNI引用的對象