外貿(mào)公司網(wǎng)站多少錢網(wǎng)頁制作作業(yè)100例
GC復制算法是Marvin L.Minsky在1963年研究出來的算法。說簡單點,就是只把某個空間的活動對象復制到其它空間,把原空間里的所有對象都回收掉。這是一個大膽的想法。在此,我們將復制活動對象的原空間稱為From空間,將粘貼活動對象的新空間稱為To空間。
1、什么是復制算法
GC復制算法是利用From空間進行分配的。當From空間被完全占滿時,GC會將活動對象全部復制到To空間。當復制完成后,該算法會把From空間和To空間互換。GC也就結束了。From空間和To空間大小必須一致。這是為了保證能把From空間中所有活動對象都收納到To空間里。
copying(){$free = $to_startfor(r:$roots)*r = copy(*r)swap($from_start, &to_start)
}
2、Copy函數(shù)
copy()函數(shù)將作為參數(shù)給出的對象復制,再遞歸復制其子對象。
copy(obj){if(obj.tag != COPIED)copy_data($free,obj,obj.size)obj.tag = COPIEDobj.forwarding = $free$free += obj.sizefor(child:children(obj.forwarding))*child = copy(*child)return obj.forwarding
}
3、new_obj函數(shù)
跟標記清除算法不同,復制算法的分配過程非常簡單
new_obj(size){if($free + size > $free_start + HEAP_SIZE/2)copying()if($free + size > $free_start + HEAP_SIZE/2)allocation_fail()obj = $freeobj.size = size&free += sizereturn obj;
}
4、執(zhí)行過程
4.1初始狀態(tài)
為了給GC做準備,這里事先將$free指針指向To空間的開頭
4.2 B被復制后
4.3 A被復制后
接下來就是按照同樣步驟復制G及其子對象E
4.4 GC結束后
5、優(yōu)缺點
5.1優(yōu)點
- 優(yōu)秀的吞吐量
- 可實現(xiàn)高速分配
- 不會發(fā)生碎片化
- 與緩存兼容
5.2缺點
- 堆使用效率低下
- 不兼容保守式GC算法
- 遞歸調用函數(shù)
6、Cheney的復制算法
C.J.Cheney于1970年研究出GC算法,相比Fenichel和Yochelson的GC復制算法,Cheney的算法不是簡單遞歸的,而是迭代地進行復制。
copying(){scan = $free = $to_startfor(r:$roots)*r = copy(*r)while(scan != $free)for(child : children(scan))*child = copy(*child)scan += scan.sizeswap($from_start, &to_start)
}
6.1 copy函數(shù)
copy(obj){if(is_pointer_to_heap(obj.forwarding,$to_start) == FALSE)copy_data($free,obj,obj.size)obj.forwarding = $free$free += obj.sizereturn obj.forwarding
}
6.2 執(zhí)行過程
6.2.1初始狀態(tài)多引入了一個scan
6.2.2在cheney算法中,首先復制所有從根直接引用的對象
6.2.3 然后在所有b和g
6.3 優(yōu)缺點
優(yōu)點:因為該算法是迭代的,所以他可以抑制調用函數(shù)額外負擔和棧的消耗。特別是拿堆用作隊列,省去了用于搜索的內(nèi)存空間這一點,實在是令人贊嘆。
缺點:有引用關系的對象并不相鄰,不兼容緩存。當然這是因為他是局域廣度優(yōu)先遍歷,我們可以通過修改其搜索算法,利用深度優(yōu)先遍歷來解決這個問題。
7、多空間復制算法
GC復制算法最大的缺點就是只能利用半個堆,這是因為該算法將整個堆分成了兩半,每次都要騰出一半來。
多空間復制算法就是把堆N等分,對其中2塊空間執(zhí)行GC復制算法,剩下的N-2塊空間執(zhí)行GC標記清除算法,也就是把這兩種算法組合起來使用。
優(yōu)點:更有效的利用了堆空間
缺點:因為只有兩塊空間進行了復制算法,剩下的仍然是標記清除算法,因此就會有標記清除算法的固有問題:分配耗費時間,分塊碎片化等。