垃圾收集-判斷對象是否存活

《深入理解Java虛擬機》第二版-第3章讀書筆記

引用計數法

描述:

給對象添加一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任何時刻計數器爲0的對象就是不可能再被使用的(垃圾收集)。

缺點:

很難解決相互引用的問題
例如下面這種情況,這兩個對象已經不可能再被訪問,但是由於相互引用,導致它們的引用計數都不爲0,導致GC收集器無法回收它們。

public class Test{
    public Object instance = null;

    public static void test(){
        Test a = new Test();
        Test b = new Test();
        a.instance = a;
        b.instance = b;

        a = null;
        b = null;

        System.gc();
    }
}

可達性分析算法

描述:

通過一系列的成爲“GC Roots”的對象作爲起始點,從這些節點開始向下搜索,搜索走過的路徑稱爲“引用鏈”(Reference Chain),當一個對象到GC Roots沒有任何引用鏈時(從GC Roots到該對象不可達),則證明此對象是不可用的。

GC Roots:

具體到java中時,GC Roots包括:
1.虛擬機棧(棧幀中的本地變量表)中引用的對象
2.方法區中類靜態屬性引用的對象
3.方法區中常量引用的對象
4.本地方法棧中JNI(即一般說的Native方法)引用的對象

引用

兩種方法都與引用有關。

JDK1.2以前:

java中的引用定義:如果reference類型的數據中存儲的數值代表的是另外一塊內存的起始地址,就稱這塊內存代表着一個引用。
在這種定義下,一個對象只有引用或者沒有被引用兩種狀態。

JDK1.2之後:

Java對引用的概念進行了擴充,將引用分爲強引用、軟引用、弱引用、虛引用4種,這4中引用的強度一次減弱。

強引用(strong reference):

類似“Object obj = new Object()”這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象。

軟引用(soft reference):

用來描述一些還有用但並非必需的對象。對於軟引用關聯着的對象,在系統將要發生內存溢出異常之前,將會把這些對象列進回收範圍之中進行二次回收。

弱引用(weak reference):

也是用於描述非必需的對象,但是它的強度比軟引用更弱一些,被弱引用關聯的對象只能生存到下一次垃圾收集發生之前。當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉只被弱引用關聯的對象。

虛引用(phantom reference):

最弱的一種引用關係。該引用完全不會對其生存時間構成影響,也無法通過一個弱引用來取得一個對象實例。設置該引用的唯一目的是能在這個對象被收集器回收時收到一個系統通知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章