Java虛擬機器學習(2) 垃圾收集演算法

2021-07-24 08:32:20 字數 2379 閱讀 2837

跟蹤收集器採用的為集中式的管理方式,全域性記錄物件之間的引用狀態,執行時從一些列gc  roots的物件做為起點,從這些節點向下開始進行搜尋所有的引用鏈,當乙個物件到gc  roots 沒有任何引用鏈時,則證明此物件是不可用的。

下圖中,物件object6、object7、object8雖然互相引用,但他們的gc roots是不可到達的,所以它們將會被判定為是可**的物件。

可作為gc roots 的物件包括:

虛擬機器棧(棧幀中的本地變數表)中的引用物件。

方法區中的類靜態屬性引用的物件

方法區中的常量引用的物件

本地方法棧中jni的引用物件。

主要有複製、標記清除、標記壓縮三種實現演算法。 

標記清除演算法是最基礎的收集演算法,其他收集演算法都是基於這種思想。標記清除演算法分為「標記」和「清除」兩個階段:首先標記出需要**的物件,標記完成之後統一清除物件。

它的主要缺點:

①.標記和清除過程效率不高 

②.標記清除之後會產生大量不連續的記憶體碎片。

它將可用記憶體容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊用完之後,就將還存活的物件複製到另外一塊上面,然後在把已使用過的記憶體空間一次清理掉。這樣使得每次都是對其中的一塊進行記憶體**,不會產生碎片等情況,只要移動堆訂的指標,按順序分配記憶體即可,實現簡單,執行高效。

主要缺點:

記憶體縮小為原來的一半。

標記操作和「標記-清除」演算法一致,後續操作不只是直接清理物件,而是在清理無用物件完成後讓所有存活的物件都向一端移動,並更新引用其物件的指標。

主要缺點:

在標記-清除的基礎上還需進行物件的移動,成本相對較高,好處則是不會產生記憶體碎片。

引用計數收集器採用的是分布式管理方式,通過計數器記錄物件是否被引用。當計數器為0時說明此物件不在被使用,可以被**。

主要缺點:

迴圈引用的場景下無法實現**,例如下面的圖中,objectc和objectb相互引用,那麼objecta即便釋放了對objectc、objectb的引用,也無法**。sunjdk在實現gc時未採用這種方式。

Java虛擬機器學習(2) 垃圾收集演算法

跟蹤收集器採用的為集中式的管理方式,全域性記錄物件之間的引用狀態,執行時從一些列gc roots的物件做為起點,從這些節點向下開始進行搜尋所有的引用鏈,當乙個物件到gc roots 沒有任何引用鏈時,則證明此物件是不可用的。下圖中,物件object6 object7 object8雖然互相引用,但他...

Java虛擬機器學習 垃圾收集演算法

跟蹤收集器採用的為集中式的管理方式,全域性記錄物件之間的引用狀態,執行時從一些列gc roots的物件做為起點,從這些節點向下開始進行搜尋所有的引用鏈,當乙個物件到gc roots 沒有任何引用鏈時,則證明此物件是不可用的。下圖中,物件object6 object7 object8雖然互相引用,但他...

Java虛擬機器學習 垃圾收集演算法

跟蹤收集器採用的為集中式的管理方式,全域性記錄物件之間的引用狀態,執行時從一些列gc roots的物件做為起點,從這些節點向下開始進行搜尋所有的引用鏈,當乙個物件到gc roots 沒有任何引用鏈時,則證明此物件是不可用的。下圖中,物件object6 object7 object8雖然互相引用,但他...