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

2021-07-17 01:47:39 字數 2379 閱讀 3315

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

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

可作為gc roots 的物件包括:

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

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

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

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

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

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

它的主要缺點:

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

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

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

主要缺點:

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

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

主要缺點:

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

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

主要缺點:

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

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

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

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

跟蹤收集器採用的是集中式的管理方式,全域性記錄物件直接的引用狀態,執行時從一些gc roots的物件做為起點,從這些節點向下開始進行搜尋所有引用鏈,當乙個物件到gc roots 沒有任何引用鏈時,則證明此物件是不可用的。可以作為 gc roots 的物件包括 主要有標記清除 複製 標記 整理三種實現...

java虛擬機器 垃圾收集演算法

標記 就是標記無用的物件.正如名字一樣,先標記再清除 但是有不足 1.效率不行,標記和清除都慢2.清除之後有太多的記憶體碎片 如下圖 將記憶體 就是指堆 分為兩半,每次只用一半,當這一半滿了,就把還存活的物件複製到另外一半去,在清除已使用的那半,記憶體.但是相當於記憶體小了一半,不爽,得改 經研究發...