2011-06-24 4 views
2

に循環リストを集めます。私はここにあるいくつかのスレッドにぶつかった(とthis article SO私はもはや見つけることができたスレッドません経由で)、しかし、彼らはルビーの古いバージョンに適用するように見えたし、それらの情報は常に一貫性がありませんでした。 (物事が立つと、それは主に参照カウントであるという印象を受けています)。ごみ私はガベージコレクションにルビーのマークとスイープアプローチについて学んでいるルビー

ruby​​ 1.9.2の内部については不明な点がありますが、ルビーは厄介な後方参照を処理する方法を知っていた循環参照? (理想的には、それが実際に実装されています方法についていくつかの詳細/良いポインタを持つ。)

+0

あなたは好奇心から求めている、またはあなたがあなたのアプリケーションを最適化しようとしていますか? –

+1

大部分は好奇心から外れています。私は、ある時点でphpの循環参照に関する問題にぶつかり、ルビのdestructメソッドを見ていないと、指向(潜在的に周期的な)グラフのノードの表現をいかにうまく扱っているのか疑問に思っていました。 –

答えて

4

マークアンドスイープGC、一般的に参照カウント保存ガベージコレクションとしてラベル付けされ、ほぼすべてのアルゴリズムのように、うまく循環参照を処理します。これは特定の実装とは関係ありません。 Ruby 1.9で実際に使用されているGCにかかわらず、サイクルに問題はありません。マーク・アンド・スイープ・コレクターのアプローチのスケッチですが、他のコレクション・スキームも循環参照を同様に扱うことが保証されています。

  1. マークに常に到達可能であることが知らすべてのもの(を「ルーツ」、スコープに直接だ基本的にすべてのもの - グローバル変数、ローカル変数など)をマークしたオブジェクトが参照する
  2. マークすべて、まだマークされていないオブジェクト
  3. 繰り返し2未マークされたオブジェクトへのマークからの参照は、すべてのオブジェクトが割り当てられ
  4. 列挙残らなくなるまで、あなたが見

をマークされていないものを、reachablだ参照の円を割り当て解除eは「外部から」は無限再帰に至らず(与えられたオブジェクトの参照を2回以上訪問することはない)、到達不可能な参照の円は到達可能であるとマークされず解放される)マーキング後。

+0

だから私はこの権利を得て、それを言い換えると、irbオブジェクト(またはプログラムのメインループ/カーネル/それが呼び出されているもの)からオブジェクトへのパスがあるかどうかをチェックし、そうでなければ到達不能としてマークされます。 –

+1

@Denis:概念的には、同じ結果につながりますが、実装するのは非常に難しいでしょう。だから私たちは、到達可能な "経路"が見つかるまで、すべてが到達不能であると仮定します。 – delnan

+0

それはかなり鋭いです。 :-) –

関連する問題