C/C++中幾種經典的垃圾回收算法
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
1.引用計數算法
引用計數(Reference Counting)算法是每個對象計算指向它的指針的數量,當有一個指針指向自己時計數值加1;當刪除一個指向自己的指針時,計數值減1,如果計數值減為0,說明已經不存在指向該對象的指針了,所以它可以被安全的銷毀了。可以很直觀的用下面的圖表示:
引用計數算法的優點在于內存管理的開銷分布于整個應用程序運行期間,非常的“平滑”,無需掛起應用程序的運行來做垃圾回收;而它的另外一個優勢在于空間上的引用局部性比較好,當某個對象的引用計數值變為0時,系統無需訪問位于堆中其他頁面的單元,而后面我們將要看到的幾種垃圾回收算法在回收前都回遍歷所有的存活單元,這可能會引起換頁(Paging)操作;最后引用計數算法提供了一種類似于棧分配的方式,廢棄即回收,后面我們將要看到的幾種垃圾回收算法在對象廢棄后,都會存活一段時間,才會被回收。
引用計數算法有著諸多的優點,但它的缺點也是很明顯的。首先能看到的一點是時間上的開銷,每次在對象創建或者釋放時,都要計算引用計數值,這會引起一些額外的開銷;第二是空間上的開銷,由于每個對象要保持自己被引用的數量,必須付出額外的空間來存放引用計數值;引用計數算法最大的缺點就在于它無法處理環形引用,如下圖所示:
此 處藍色的這兩個對象既不可達也無法回收,因為彼此之間互相引用,它們各自的計數值都不為0,這種情況對引用計數算法來說是無能為力的,而其他的垃圾回收算法卻能很好的處理環形引用。
引用計數算法最著名的運用,莫過于微軟的COM技術,大名鼎鼎的IUnknown接口:
[cpp] view plaincopy