天天看點

Java對象是否存活之引用計數算法&可達性分析算法

java通過虛拟機的GC機制來完成不使用對象的回收,虛拟機判斷對象是否存活的方法有兩種,分别是引用計數算法和可達性分析算法。

  • 引用計數算法

    為對象添加一個引用計數器,每當有位置引用它的時候,計數器的值就加1,當引用失效的時候,引用的計數值減1。當引用計數器的值為0時表示對象不可再被使用。

class B {
    C c;
}

class C {
    B b;
}

public class A {

    public static void main(String[] args) {
        C c=new C();
        B b=new B();
        c.b=b;
        b.c=c;
        b=null;
        c=null;
    }
}
           

以上代碼中,建立b和c對象之後,其引用計數器的值分别為1,當c對象和b對象互相引用對方後,其引用計數器的值分别增加為2,那麼當b和c均指派為null之後,引用計數器的值分别減1,變為1,雖然已經不會再被使用,但不會被垃圾回收。

  • 可達性分析

    可達性分析的思路是通過判斷目前對象到 GC Roots 存不存在引用路徑,即引用鍊,為什麼這樣就可以判斷對象是否存活呢?我們首先分析一下哪些對象可以作為GC Roots。

    首先,一類可以作為GC Roots的對象是棧(包括虛拟機棧和本地方法棧)中的對象,因為棧幀随着方法的執行和退出自動進棧和出棧,那麼在棧中對象必然是有用的,那麼其引用的對象也必然是有用的,還有其引用的對象再引用的對象。。。。。。。

    那麼我們可以看到,通過判斷一個對象到GC Roots是否存在一條可達路徑,即可以作為判斷對象是否有用的标準。

    再補充一點,可以作為GC Roots對象的還有靜态變量和常量引用的對象。