2011-06-24 38 views
2

我學習Ruby的標記和清除的方法來收集垃圾收集循環列表。我(通過和this article一個SO線程,我可以不再點)碰到了幾個線程在這裏和那裏,但他們似乎適用於舊版本的紅寶石和他們的信息並不總是一致的。 (至少我認爲這主要是引用計數。)垃圾紅寶石

可能任何具有某些Ruby on Rails 1.9.2內部知識的人都會在附近進行編程,瞭解Ruby是否知道如何處理棘手的後向引用和循環參考? (理想情況下與它如何實際實施的一些詳細信息/良好的指針。)

+0

你問出於好奇,或者是你想優化你的應用程序? –

+1

出於好奇,主要是。我遇到了一個循環引用的問題,在一個點上,並沒有看到ruby中的任何破壞方法,想知道它處理的方式有多好,比如在一個面向(可能是循環)圖中的節點表示。 –

回答

4

馬克 - 清除GC,像幾乎所有的常用標記爲垃圾收集保存引用計數算法,處理循環引用就好了。這與具體實施無關。無論Ruby 1.9使用何種實際的GC,它都不會遇到週期問題。以下是標記和清除收集器方法的草圖,但請確保其他收集方案也處理循環引用。

  1. 馬克已知總是可到達的所有東西(「根」,基本上一切的直接範圍 - 全局變量,局部變量等)通過標記的對象引用
  2. 標記所有尚未標記物
  3. 重複步驟2,直到沒有引用從標記爲還未標記的對象仍然
  4. 枚舉所有對象分配,將釋放那些沒有標明

你看,引用了一圈這reachabl e「來自外部」不會導致無限遞歸(我們不會多次訪問給定對象的引用),並且不可訪問的引用循環未標記爲可訪問並因此被釋放(每個元素獨立)標記後。

+0

好的。所以,如果我正確地修改了它,它會檢查是否有從irb對象(或程序的主循環/內核/不管它所調用的)到對象的任何路徑,如果沒有,它會被標記爲無法訪問? –

+1

@Denis:從概念上講,這會導致相同的結果,但實施起來很難。因此,我們假設在我們找到一條可達的「路徑」之前,一切都無法訪問。 – delnan

+0

非常精明。 :-) –