【JVM】GC 可達性分析中哪些算是GC ROOT?


 

至今為止,我基本上發現網上沒有幾個博客說的很明白的,今天我在這里斗膽總結一下,各位大佬,如有錯誤,還望指責 ^ _ ^

 

  • 首先那肯定還得是看看概念了,在JVM中,什么可以作為GC Root呢?
    • 虛擬機棧(棧幀中的本地變量表)中引用的對象。  
    • 方法區中類靜態屬性引用的對象。
    • 方法區中常量引用的對象。
    • 本地方法棧中JNI(即一般說的Native方法)引用的對象。

 

 

  • 如果光看概念,我**也不知道指的是個啥?所以舉個栗子吧:
#此處是段偽代碼

class v {
b,c
}

class b{
d
}

class d{
c
}

class c{
b
}

1
. fun(...){ 2. v a = new A; 3. a.b = new B; 4. a.c = new C; 5. a.b.d = new D; 6. a.b.d.c = a.c; 7. a.c.b = a.b; 8. a.c = null; 9. a.b = null; 10. ............... 100. }

 

 

  • 接下來我會畫圖解釋如上代碼:

 

 

 此時可以理解為,針對對象A(GC ROOT根),BCD對象不可達。

 

 

 

  • 咱們口中常說的垃圾回收啊,都在紅圈區域,即是回收我們用new,分配在堆中的對象;
  • 而常量、全局變量、靜態變量、以及幀棧中的局部變量,都是存儲在藍圈區域的

 

 

 

  • 小結:

1》通常情況下,堆中的對象可以通過方法區中靜態變量、常量、全局變量以及幀棧中的局部變量直接或間接引用訪問;

2》但是如果堆中的對象,沒有任何引用可以直接或間接訪問的話,這個對象就是可以被回收的,所以我們也可以為非堆區域內變量及時賦NULL,以減少【minor gc】頻率。

 


免責聲明!

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



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