1. 程式人生 > >Garbage Collection :1. 哪些物件需要回收

Garbage Collection :1. 哪些物件需要回收

關於GC需要考慮的問題: ?哪些物件需要回收 ?什麼時候回收 ?如何回收

哪些物件需要回收: 已經“死去”的物件需要被回收釋放記憶體

首先,需要判斷物件是否存活。 1.引用計數法 Reference Counting 給物件新增一個引用計數器,每當有一個reference變數指向該物件時,計數器加1, 當引用失效時,計數器減1,計數器為0時表示該物件不可能在被使用。 引用計數法實現簡單,判定效率高,Java中沒有使用該方法來管理記憶體是因為它很難解決物件之間相互迴圈引用的問題。 物件之間互相迴圈使用容易造成記憶體洩漏[記憶體洩漏]而浪費空間資源。

2.可達性分析法 GC Roots Treacing 通過一系列名為“GC Roots”的物件為起點向下搜尋,搜尋路徑稱為“引用鏈” reference chain,當一個物件節點到GC Roots之間不可達,則該物件“死亡”,可以被回收。

在這裡插入圖片描述

如上圖所示,雖然物件4、5、6相互引用,但是他們與 GC Roots之間是不可達的,因此被判定為“死亡”物件可以回收。

為了描述這樣一類物件(當記憶體空間足夠時,這些物件可以儲存,若即使GC後記憶體資源依然很緊張中,那麼這些物件將會被拋棄回收),Java將引用分為四類: 1).強引用 Strong Reference : 類似“ Object obj = new Object()” 這樣的稱之為強引用,只要強引用還存在,該物件就不會被回收。

2).軟引用 Soft Reference : 關聯有用,但是非必需的物件。 對於軟引用關聯的物件,當記憶體不足時,會將這些物件列為回收範圍進行第二次回收,如果這次回收後記憶體依然不足,會丟擲記憶體溢位異常。 Java提供了SoftReference類來實現軟引用。

3).弱引用 Weak Reference: 關聯非必需物件,強度較軟引用更弱一點。 弱引用關聯物件智慧生存到下一次GC發生的時間。當垃圾回收器工作時,無論記憶體是否夠用,弱引用關聯的物件都會被回收。 Java 提供了WeakReference類實現弱引用

4).虛引用 Phantom Reference:虛引用不會對物件的生命週期造成影響,也無法通過虛引用來獲得一個物件例項。為物件設定虛引用的唯一目的就是希望在回收該物件時受到一個系統通知。 Java 提供了PhantomReference 類來實現虛引用。