jvm垃圾回收-可達性分析算法之GC Roots理解


《深入理解JVM》原文:

  在主流的商用程序語言中(Java和C#),都是使用可達性分析算法判斷對象是否存活的。這個算法的基本思路就是通過一系列名為GC Roots的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的,下圖對象object5, object6, object7雖然有互相判斷,但它們到GC Roots是不可達的,所以它們將會判定為是可回收對象。

 

 

 

 

一般來說,如下情況的對象可以作為GC Roots:

  1. 虛擬機棧(棧楨中的本地變量表)中的引用的對象
  2. 方法區中的類靜態屬性引用的對象
  3. 方法區中的常量引用的對象
  4. 本地方法棧中JNI(Native方法)的引用的對象

我的理解:

  可以看出,以上觀點認為GC Roots是指對象,而我認為恰好相反,它指的應該是引用,不是堆中的對象。首先我們是能找虛擬機棧中的對象引用,也就是GC roots,通過它,我們能找到堆中被引用的對象,我們給他標記一次,然后順着字段引用不斷往下找,路徑上的都標記一下。全部標記完成后,違背標記的就是不可達對象,進行回收。下面看一個簡單的例子:

public static void main(String[] args) {
Object ref1 = new Object();
Object ref2 = new Object();
ref1 = ref2;
}

假設ref1指向的對象是堆中的對象instance1,ref2指向堆中的對象instance2,在第四行代碼執行前后引用關系變化圖如下:

 

 所以GC Root set指的是應該是引用的集合,可以分為以下幾種:

  1. 虛擬機棧(棧楨中的本地變量表)中的引用
  2. 方法區中的類靜態屬性引用
  3. 方法區中的常量引用
  4. 本地方法棧中JNI(Native方法)的引用

最后,以上為我個人觀點,如果有誤,歡迎各位大佬批評指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM