1

私は、学習経験と高校卒業時の履歴書の両方のために、最近の週末に独自のスクリプト言語を書き始めました。基本的な型 (null、boolean、number、および string) で変数を解析し、演算子の優先順位を使用して数式を解析し、基本的なマークとスイープ ガベージ コレクターを配置できます (マーク/スイープ コレクターの完了後)。世代別ガベージ コレクタを実装します。ナイーブ マーク/スイープはあまり高速ではないことはわかっています)。ただし、ガベージ コレクターの参照オブジェクトを格納する方法がわかりません。今のところ、メモリへのポインタとマークされているかどうかを格納するクラス GCObject があります。リンクされたリストをそれに保存する必要がありますか ' クラス内のオブジェクトを参照していますか? 私は他の言語のガベージ コレクターを見てきましたが、GCObject ごとの参照のリンクされたリストが表示されないため、混乱しています。

TLDR: 他のオブジェクトによって参照されるオブジェクトをマーク アンド スイープ ガベージ コレクタに格納するにはどうすればよいですか? オブジェクトのリンクされたリストをすべての GCObjects に保存するだけですか?

みんなありがとう。

4

1 に答える 1

3

通常、オブジェクトへの参照は、それらの参照が自然に発生する場所以外には保存しません。マーク操作中は、どの参照がオブジェクトを指しているかを知る必要はありません。むしろ、オブジェクト (またはルート) に含まれる参照を知る必要があるため、それらのオブジェクトを再帰的にマークできます。

また、スイープ フェーズでは、参照されていないオブジェクトをファイナライズし、それらのストレージを割り当てプールに戻すことができるように、すべてのオブジェクトを反復処理する方法も必要です。これを正確に行う方法は、汎用アロケーターによって異なります。おそらく、カスタム アロケーターを作成する必要があります。

(圧縮をしたくないと仮定しています-それははるかに複雑です)。

于 2012-04-02T23:00:24.840 に答える