3

「古い」世代 (少なくとも 1 つのコレクションを生き残ったオブジェクト) と「若い」世代 (新しく割り当てられた) の 2 つの世代のみを持つ単純な世代別 GC があると仮定しましょう。では、参照グラフ全体を根元から追跡せずに、GC はどのようにして「若い」オブジェクトをガベージであると判断するのでしょうか? 別の言い方をすれば、「若い」世代のみを収集する場合、GC はトレースのルートとして何を選択するのでしょうか。

私は一般的な方法に興味がありますが、既存の実装からの特定の例にも興味があります。

ありがとう!

4

1 に答える 1

3

いくつかのテクニックがありますが、それらはすべて、どの古い世代のオブジェクト (または古い世代のメモリの範囲) に若いオブジェクトへの参照が含まれている可能性があるかという知識を維持することに帰着します。

私が考えることができるほとんどすべての実装は、書き込みバリアを追加することによってこの知識を維持します。これらの書き込みバリアは、若い世代の参照が古い世代のオブジェクトに格納されたときにトリガーされ、それによって新しい参照を記憶する小さなコード スニペットが実行されます。

その知識を保存するために、一部の GC はカード マーキング を使用します。この場合、コンパクトなビットマップを使用して、小さなメモリ ブロックを「若い世代への参照を含む」としてマークします。他のものは、個々のオブジェクトに対して同様のことを行う明示的な「記憶セット」を維持します。どちらの場合も、若い世代のコレクションは、(カード テーブルによってマークされた記憶されたセット/メモリ ブロック) 内のオブジェクトをルートに追加します。

具体的な実装については:

于 2012-12-01T12:29:51.647 に答える