1. 程式人生 > >三種基本的GC演算法基石

三種基本的GC演算法基石

一、 標記/清除演算法

記憶體中的物件構成一棵樹,當有效的記憶體被耗盡的時候,程式就會停止,做兩件事,第一:標記,標記從樹根可達的物件(途中水紅色),第二:清除(清楚不可達的物件)。標記清除的時候有停止程式執行,如果不停止,此時如果存在新產生的物件,這個物件是樹根可達的,但是沒有被標記(標記已經完成了),會清除掉。

缺點:遞迴效率低效能低;釋放空間不連續容易導致記憶體碎片;會停止整個程式執行;

二、 複製演算法

把記憶體分成兩塊區域:空閒區域和活動區域,第一還是標記(標記誰是可達的物件),標記之後把可達的物件複製到空閒區,將空閒區變成活動區,同時把以前活動區物件1,4清除掉,變成空閒區。

速度快但耗費空間,假定活動區域全部是活動物件,這個時候進行交換的時候就相當於多佔用了一倍空間,但是沒啥用。

三、 標記整理演算法

平衡點

標記誰是活躍物件,整理,會把記憶體物件整理成一課樹一個連續的空間,


標記-清除演算法會使記憶體產生碎片,那麼如何解決這個問題,很顯然,清除以後再整理一下記憶體不就行了麼。

然而標記-整理演算法不是簡單滴整理一下記憶體。

標記-整理(Mark-Compact)演算法不直接對可回收物件進行清理,而是讓所有可用的物件都向一端移動。然後直接清理掉邊界意外的記憶體。

這裡寫圖片描述

很顯然,整理這一下需要時間,所以與標記清除演算法相比,這一步花費了不少時間,但從長遠來看,這一步還是很有必要的。

該演算法可謂“道德高尚,自己栽樹,後人乘涼”