Ruby的GC機制原始碼分析(2)

2021-08-25 14:52:48 字數 943 閱讀 7415

停止與複製

停止與複製型gc 是標記與清除型gc 的乙個變體。首先,準備多個物件域。為了簡化討論,假設只有兩個域:a 和b 。將一邊標記為「active」 ,生成的物件都放到active 域中(圖5 )。

圖5: 停止與複製(1 )

執行gc 時,按照標記與清除同樣的路徑進行搜尋。但是,與標記不同的是,物件本身移到了另外乙個空間(圖6 )。搜尋全部鏈結之後,只要拋棄留在a 中的物件,將b 標記為active 即可。

圖6: 停止與複製(2 )

停止與複製也有兩個優點。

· 記憶體**的同時一併完成壓縮。

· 相互引用的物件會聚集在附近,有助於提高快取的命中率

缺點也是兩個。

· 需要兩倍以上的物件域

· 物件的位置發生了變化

可見天下沒有免費的午餐。

引用計數

引用計數不同於之前介紹的東西,它的檢查分布在**各處。

首先,為每個物件加上乙個整數計數器。當變數或陣列引用時,物件的計數器就會增加。停止引用時,計數器就會隨之減少。計數器為0 時,就會釋放。這便是引用計數的方法(圖7 )。

圖7: 引用計數

這種方法有兩個優點。

· gc 的負擔分散到整個程式之中

· 不必需的物件能夠立刻得到釋放

缺點也是兩個。

· 容易遺忘對計數器的操作

· 簡單的方法無法處理環

這裡解釋一下第二點。環(cycle )指得是圖8 所示的有迴圈引用關係的狀態。變成這樣的話,計數器便不會減少,也就絕對無法釋放。

圖8: 環

順便說一下,最新的python (2.2 )採用了引用計數,其中的環可以釋放。但這並不是引用計數本身的力量,不過是時常採用標記與清除型gc 檢查罷了。

Ruby的GC機制原始碼分析(4)

正如說過的那樣,ruby的gc是標記和清除型。具體來說,標記就是設定fl mark標誌。搜尋已用的value,設定fl mark,全部檢查過之後,再來看物件堆,釋放那些沒有設定fl mark的物件。rb gc mark 是乙個遞迴標記物件的函式。rb gc mark 首先,rany 定義如下。沒什麼...

Ruby原始碼分析

struct rbasic struct robject struct rclass 以前研究過jvm,再看看動態語言原理都差不多。和jvm一樣,其中存著兩個必須的東西,變數表 iv tbl 和方法表 m tbl 這裡的變數表應該是只包含類變數 我不確定 super表示父類。其中為什麼要包含乙個變數...

ruby0 49原始碼分析2

ruby0.49原始碼分析2 週末重新打造讀程式的環境。在臥室裡布置了兩台電腦,每台筆記本加個顯示器。一台專門用於讀 另一台,專門用於寫測試程式,並把上網功能去掉。最大限度的保持專注。因為ruby中定義了資料結構,把資料結構的定義抄下來,然後貼在牆面上,就象警察破案一下,準備乙個大的工作板。發現證據...