一言で言えば:ガベージコレクタは、再帰を使用しないでください。これらは、本質的に2つのセット(組み合わせ可能)を追跡することにより、トレースを制御するだけです。トレースとセル処理の順序は関係ないため、実装をかなり自由に表現できます。したがって、実際にはメモリ使用量が非常に少ない多くのソリューションがあります。これは、ヒープがメモリ不足になると正確に呼び出されるため、不可欠です。新しいページを簡単に割り当てることができるため、大きな仮想メモリでは状況が少し異なります。そして、その大敵はスペースの不足ではなく、データの局所性の欠如
です。
質問が当てはまらない参照カウントではなく、ガベージコレクターのトレースを検討していると思います。
UV
最初に注意することは、すべてのトレースGCは、プログラムからアクセス可能なメモリ内のセルの有向グラフの体系的な調査に基づいた同じ抽象モデルに従うことです。メモリセルは頂点であり、ポインタは有向エッジです。そのために次のセットを使用します。
VUUT
UV
UcVUcUT
UUV=TVH− VV
VうんうんT
また、セルとは何か、1つまたは複数のサイズであるかどうか、それらの中でポインターを見つける方法、それらを圧縮する方法、およびガベージコレクションに関する書籍や調査で見つけることができる他の多くの技術的な問題に関する詳細はスキップします。
うん
既知の実装が異なるのは、これらのセットが実際に表現される方法です。多くの手法が実際に使用されています:
ビットマップ:各メモリセルに1ビットのマップ用に一部のメモリ空間が保持されます。これは、セルのアドレスを使用して見つけることができます。ビットは、対応するセルがマップで定義されたセットにあるときにオンになります。ビットマップのみを使用する場合、セルごとに2ビットのみが必要です。
または、各セルにマークするための特別なタグビット(または2)のスペースがあります。
log2pp
セルのコンテンツとそのポインターで述語をテストできます。
表示されているセットに属するすべてのセルのみを対象としたメモリの空き部分にセルを再配置できます。
VTTU
単一のセットであっても、これらの手法を実際に組み合わせることができます。
前述のように、上記のすべては、実装されているガベージコレクターによって使用されていますが、奇妙に思えるかもしれません。それはすべて、実装のさまざまな制約に依存します。また、メモリ使用量がかなり安くなる可能性があります。最終結果には関係ないため、その目的のために自由に選択できる処理順序ポリシーが役立つ可能性があります。
新しい領域にセルを転送する、最も奇妙なものと思われるものは、実際には非常に一般的です。それはコピーコレクションと呼ばれます。ほとんどの場合、仮想メモリで使用されます。
明らかに再帰はなく、ミューテーターアルゴリズムスタックを使用する必要はありません。
もう1つの重要な点は、多くの最新のGCが大きな仮想メモリ用に実装されていることです。その後、新しいページを簡単に割り当てることができるため、実装するスペースと余分なリストまたはスタックを確保することは問題になりません。しかし、大きな仮想記憶では、敵はスペースの不足ではなく、場所の不足です。次に、セットを表す構造とその使用は、データ構造とGC実行の局所性を維持するように調整する必要があります。問題はスペースではなく時間です。不適切な実装は、メモリオーバーフローよりも許容できない速度低下を示す可能性が高くなります。
これらの手法のさまざまな組み合わせに起因する多くの特定のアルゴリズムについては言及しませんでした。