至今為止,我基本上發現網上沒有幾個博客說的很明白的,今天我在這里斗膽總結一下,各位大佬,如有錯誤,還望指責 ^ _ ^
- 首先那肯定還得是看看概念了,在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】頻率。