追蹤收集器所採用的為集中式的管理方式,全域記錄物件之間的引用狀態,執行時從一些列GC Roots的物件做為起點,從這些節點向下開始進行搜尋所有的引用鏈,當一個物件到GC Roots 沒有任何引用鏈時,則證明此物件是不可用的。
下圖中,物件Object6、Object7、Object8雖然互相引用,但他們的GC Roots是不可到達的,所以它們將會被判定為是可回收的物件。
虛擬機器棧(棧幀中的本地變數表)中的引用對象。
方法區中的類別靜態屬性所引用的物件
NI的引用對象。
主要有複製、標記清除、標記壓縮三種實現演算法。
1. 標記 - 清除演算法
演算法則是基於這種想法而收集
演算法是基於這種想法。標記清除演算法分為「標記」和「它的主要缺點:清除」兩個階段:首先標記需要回收的對象,標記完成之後統一清除對象。
②.標記清除之後會產生大量不連續的記憶體碎片。
它將可用記憶體容量分為大小相等的兩塊,每次只使用其中的一塊。當這一塊用完之後,就將還存活的物件複製到另外一塊上面,然後在把已使用過的記憶體空間一次清理掉。這樣使得每次都是對其中的一塊進行內存回收,不會產生碎片等情況,只要移動堆訂的指針,按順序分配內存即可,實現簡單,運行高效。
主要缺點:
記憶體縮小為原來的一半。
3. 標記
- 整理演算法
標記-清除」演算法一致,後續操作不只是直接清理對象,而是在清理無用對象完成後讓所有存活的對像都向一端移動,並更新引用其對象的指針。
主要缺點:
在標記
引用計數收集器採用的是分散式管理方式,透過計數器記錄物件是否被引用。當計數器為0時說明此物件不在被使用,可以被回收。主要缺點:
循環引用的場景下無法實現回收,例如對下面的圖中,ObjectC和ObjectBObject,循環引用的場景下無法實現回收,例如對Object也無法回收。 sunJDK在實現GC時未採用這種方式。
. )!