1. 程式人生 > >JVM垃圾回收集演算法 —— 標記-清除演算法、複製演算法、標記-整理演算法

JVM垃圾回收集演算法 —— 標記-清除演算法、複製演算法、標記-整理演算法

標記-清除演算法

1、執行過程:如同它的名字一樣,演算法分為“標記”和“清除”兩個階段:首先標記出所有需要回收的物件,在標記完成後統一回收所有被標記的物件

2、該演算法是回收演算法中最基礎的演算法,其他的演算法都是基於該演算法進行改進的

3、缺點:
(1)效率問題:標記和清除兩個過程的效率都不高
(2)空間問題:標記清除之後會產生大量不連續的記憶體碎片,空間碎片太多可能會導致以後在程式執行過程中需要分配較大物件時,無法找到足夠的連續記憶體而不得不提前觸發另一次垃圾收集動作。

標記—清除演算法的執行過程如圖所示:
這裡寫圖片描述


複製演算法

1、執行過程:它將可用記憶體按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的記憶體用完了,就將還存活著的物件複製到另外一塊上面,然後再把已使用過的記憶體空間一次清理掉。

2、優點:該演算法每次都是對整個半區進行記憶體回收,記憶體分配時也就不用考慮記憶體碎片等複雜情況,只要移動堆頂指
針,按順序分配記憶體即可,實現簡單,執行高效。

3、缺點:將記憶體的可用大小縮小為了原來的一半

複製演算法的執行過程如圖所示:
這裡寫圖片描述


標記-整理演算法

1、來源:在複製演算法中如果該記憶體區域物件存活率較高的話,就需要頻繁的複製操作,效率非常低下(比如老年代中的對記憶體區域)

2、執行過程:與“標記-清除”演算法一樣,但後續步驟不是直接對可回收物件進行清理,而是讓所有存活的物件都向一端移動,然後直接清理掉端邊界以外的記憶體

標記-整理演算法的執行過程如圖所示:
這裡寫圖片描述


本文的內容、圖片參考自:《深入理解Java虛擬機器:JVM高階特性與最佳實踐》