⑴ 可達性分析演算法(根搜索演算法GCRoots)
根搜索演算法的基本思路就是通過一系列名為」GC Roots」的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的。
這個演算法的基本思想是通過一系列稱為「GC Roots」的對象作為起始點,從這些節點向下搜索,搜索所走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈(即GC Roots到對象不可達)時,則證明此對象是不可用的。
那麼問題又來了,如何選取GCRoots對象呢?在Java語言中,可以作為GCRoots的對象包括下面幾種:
(1). 虛擬機棧(棧幀中的局部變數區,也叫做局部變數表)中引用的對象。
(2). 方法區中的類靜態屬性引用的對象。
(3). 方法區中常量引用的對象。
(4). 本地方法棧中JNI(Native方法)引用的對象。
下面給出一個GCRoots的例子,如下圖,為GCRoots的引用鏈。
根搜索演算法的基本思路就是通過一系列名為」GC Roots」的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的。
從上圖,reference1、reference2、reference3都是GC Roots,可以看出: reference1-> 對象實例1; reference2-> 對象實例2; reference3-> 對象實例4; reference3-> 對象實例4 -> 對象實例6; 可以得出對象實例1、2、4、6都具有GC Roots可達性,也就是存活對象,不能被GC回收的對象。 而對於對象實例3、5直接雖然連通,但並沒有任何一個GC Roots與之相連,這便是GC Roots不可達的對象,這就是GC需要回收的垃圾對象。