可達(dá)性分析算法(根搜索算法GCRoots)

根搜索算法

概念

根搜索算法的基本思路就是通過(guò)一系列名為”GC Roots”的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)開始向下搜索,搜索所走過(guò)的路徑稱為引用鏈(Reference Chain),當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連時(shí),則證明此對(duì)象是不可用的。

這個(gè)算法的基本思想是通過(guò)一系列稱為“GC Roots”的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)向下搜索,搜索所走過(guò)的路徑稱為引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈(即GC Roots到對(duì)象不可達(dá))時(shí),則證明此對(duì)象是不可用的。

那么問(wèn)題又來(lái)了,如何選取GCRoots對(duì)象呢?在Java語(yǔ)言中,可以作為GCRoots的對(duì)象包括下面幾種:

(1). 虛擬機(jī)棧(棧幀中的局部變量區(qū),也叫做局部變量表)中引用的對(duì)象。

(2). 方法區(qū)中的類靜態(tài)屬性引用的對(duì)象。

(3). 方法區(qū)中常量引用的對(duì)象。

(4). 本地方法棧中JNI(Native方法)引用的對(duì)象。

下面給出一個(gè)GCRoots的例子,如下圖,為GCRoots的引用鏈。

image.png
image.png

根搜索算法的基本思路就是通過(guò)一系列名為”GC Roots”的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)開始向下搜索,搜索所走過(guò)的路徑稱為引用鏈(Reference Chain),當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連時(shí),則證明此對(duì)象是不可用的。

從上圖,reference1、reference2、reference3都是GC Roots,可以看出: reference1-> 對(duì)象實(shí)例1; reference2-> 對(duì)象實(shí)例2; reference3-> 對(duì)象實(shí)例4; reference3-> 對(duì)象實(shí)例4 -> 對(duì)象實(shí)例6; 可以得出對(duì)象實(shí)例1、2、4、6都具有GC Roots可達(dá)性,也就是存活對(duì)象,不能被GC回收的對(duì)象。 而對(duì)于對(duì)象實(shí)例3、5直接雖然連通,但并沒有任何一個(gè)GC Roots與之相連,這便是GC Roots不可達(dá)的對(duì)象,這就是GC需要回收的垃圾對(duì)象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容