GC_4_GC複製算法

clipboard.png

4 GC複製算法算法

  Copying GC是Marvin L.Minsky在1963年研究出來的算法。就是指把某個空間裏的活動對象複製到其它空間,把原空間裏的全部對象都回收掉。在此,將複製活動對象的原空間稱爲From空間,將粘貼活動對象的新空間稱爲To空間。緩存

4.1 什麼是GC複製算法
  GC複製算法是利用From空間進行分配的。當From空間被徹底佔滿時,GC會將活動對象所有複製到To空間。當複製完成後,該算法會把From空間和To空間互換,GC也就結束了。From空間和To空間大小必須一致。這是爲了保證能把From空間中的全部活動對象都收納到spa

clipboard.png

4.1.1 執行過程
假設目前堆裏的配置以下。
  指針

clipboard.png

執行GC。首先是從根直接引用的對象B和G,B先被複制到了To空間。對象

clipboard.png

將B被複制後生成的對象稱爲B’。在From空間中B已經被打上了複製完成標籤。可是,這裏只把B’複製了過來,它的子對象A還在From空間裏,下面把A複製到To空間裏。
  ip

clipboard.png

此次纔是真正意義上覆制了B。由於A沒有子對象,因此對A的複製就完成了。 內存

接下來,要和複製B同樣從根引用複製G,以及其子對象E。雖然B也是G的子對象,不過由於已經複製完B了,因此只要把從G執行B的指針轉換到B’上。 it

最後,只要把From空間和To空間互換,GC就結束了。 class

clipboard.png

對象C、D、F由於無法從根查找,因此會被回收。這裏程序是以B、A、G、E的順序搜索對象的,使用的是深度優先搜索。cli

4.2 優勢
4.2.1 優秀的吞吐量

GC標記-清除算法消耗的吞吐量是搜索活動對象(標記階段)所花費的時間和搜索總體堆(清除階段)所花費的時間之和。

另外一方面,由於GC複製算法只搜索並複製活動對象,因此跟通常的GC標記-清除算法相比,它能在短期內完成GC,也就是說其吞吐量優秀。

尤爲是堆越大,差距越明顯。GC標記-清除算法在清除階段所花費的時間會不斷增長,但GC複製算法就不會。由於它消耗的時間是與活動對象的數量成比例的。

4.2.2 可實現高速分配

GC複製算法不使用空閒鏈表,由於分塊是一塊連續的內存空間。所以,調查這個分塊的大小,只要這個分塊大小不小於所申請的大小,那麼移動指針就能夠進行分配了。

比起GC標記-清除算法和引用計數算法等使用空閒鏈表的分配,GC複製算法明顯快得多。使用空閒鏈表是爲了找到知足要求的分塊,須要遍歷空閒鏈表,最壞的狀況是咱們不得不從空閒鏈表中取出最後一個分塊,這樣就用了大量時間把全部分塊都調查一遍。

4.2.3 不會發生碎片化

基於算法性質,活動對象被集中安排在From空間的開頭。像這樣把對象從新集中,放在堆中一端的行爲叫做壓縮。在GC複製算法中,每次運行GC時都會執行壓縮。

所以GC算法有個很是優秀的特色,就是不會發生碎片化,也就是說能夠安排分塊容許範圍內大小的對象。

另外一方面,在GC標記-清除算法等GC算法中,一旦安排了對象,原則上就不能再移動它了,因此會多多少少產生碎片化。

4.2.4 與緩存兼容

在GC複製算法中有引用關係的對象會被安排在堆裏離彼此較近的位置。B’引用A’,G’引用E’的順序排列。這種狀況有一個優勢,那就是mutator執行速度極快。不少CPU都經過緩存來來高速讀取位置較近的對象。這也是藉助壓縮來完成的,經過壓縮來把有引用關係的對象安排在堆中較近的位置。

4.3 缺點
4.3.1 堆使用率低下

GC複製算法把堆分紅二等分,一般只能利用其中一半來安排對象。也就是說只有一半堆能被使用,相比其餘能使用整個堆的GC算法而言,這是GC複製算法的一個重大缺陷。

4.3.2 不兼容保守式GC算法

GC標記-清除算法有着跟保守式GC算法相兼容的優勢。由於GC標記-清除算法不用移動對象。

另外一方面,GC複製算法必須移動對象重寫指針,因此有着跟保守式GC算法不相容的性質。雖然有限制條件,GC複製算法和保守式GC算法能夠進行組合。

相關文章
相關標籤/搜索