1. 程式人生 > >判斷Java對象死亡的兩種常用算法

判斷Java對象死亡的兩種常用算法

fin 引用 分享 mage 表達 nat obj 不可用 若是

當對象不餒引用的時候,這個對象就是死亡的,等待GC進行回收。

1.引用計數法

概念:

給對象中添加一個引用計數器,每當有一個地方引用它時,計數器值就增加1;當應用失效時,計數器值就減1;任何時刻計數器為0是對象就是不可能再被使用的。

但是:

主流的java虛擬機並沒有選用引用計數器算法,其中一個最主要的原因是:它很難解決對象之間是相互循環引用。

優點:算法的實現簡單,判定效率高,大部分情況下是一個不錯的算法。很多地方應用到它

缺點:

引用和去引用伴隨假發和減法,影響性能。

致命的缺陷:對於循環引用的對象無法進行回收。

2.根搜索算法(JVM采用的算法)

概念:設立若幹種根對象,當任何一個根對象(GC Root)到某一個對象均不可達時,則認為這個對象是可以被回收的。

註意:這裏提到,設立若幹種根對象,當任何一個根對象到某一個對象均不可達時,則認為這個對象是可以被回收的。

可達性分析:

從根(GC root)的對象作為起始點,開始向下搜索,搜索所走過的路徑稱為“引用鏈”,當一個對象到GC root沒有任何引用鏈相連(用凸輪的概念來講,就是從GC Root到這個對象不可達)時,則證明此對象是不可用的。

技術分享

如上圖所示,ObjectD和ObjectE是互相關聯的,但是由於GC root到這兩個對象不可達,所以最終D和E還是會被當做GC的對象,上圖若是采用引用計數法,則A-E五個對象都不會被回收。

根(GC roots)

說到GC roots(GC根),在Java語言中,可以當做GC root的對象有以下幾種:

1.棧(棧幀的本地變量表)中引用的對象

2.方法區中的靜態成員。

3.方法區中的常量引用的對象(全局變量)

4.本地方法棧中JNI(一般說是Native方法)引用的對象。

註意:第一和第四都是指的方法的本地變量表,第二種表達的意思比較清晰,第三種主要指的是生命為final的常量值。

在根搜索算法的基礎上,現在虛擬機的實現當中,垃圾收集的算法主要有三種,分別是標記-清除算法,復制算法,標記著呢管理算法。這三種算法都擴充了根搜索算法,不過他們理解起來還是非常好理解的。

判斷Java對象死亡的兩種常用算法