根搜索算法
概念
根搜索算法的基本思路就是通過(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的引用鏈。


根搜索算法的基本思路就是通過(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ì)象。