私は単純なスクリプト言語に取り組んでおり、ガベージ コレクターのしくみを理解するのに助けが必要です。私が理解している限り、ガベージコレクターには2つのことがあります。
オブジェクト プール - 割り当てられたすべてのオブジェクトが含まれ、単純な配列として表すことができます。VM がオブジェクト (Number、String など) を作成すると、適切なインスタンスが作成され、オブジェクト プールにプッシュされます。
// init object pool var objectPool = []; // create new Number var numberObj = new Number(123); // push numberObj into objectPool objectPool.push(numberObj); // create new String var stringObj = new String("foo"); // push stringObj into objectPool objectPool.push(stringObj);
フレーム (正しい用語かどうかは不明) - objectPool 内のオブジェクトへの参照が含まれています。変数を作成してそれに値を割り当てると、VM はフレームにエントリを作成します。変数値を取得する必要がある場合は、フレーム内で確認します。フレームはハッシュ マップとして表すことができます。
// init frame var frame = {}; // create new String var stringObj = new String("bar"); // push stringObj into objectPool objectPool.push(stringObj); // write stringObj into the frame frame["foo"] = stringObj;
ガベージ コレクション (少なくともマーク & スイープの実装) には、次の 2 つの手順が含まれます。
マーク: フレームに含まれるオブジェクトをウォークスルーし、それらをマークします。
for (var varName in frame) frame[varName].marked = true;
スイープ: objectPool に含まれるオブジェクトをウォークスルーし、マークされていないオブジェクトをすべて削除 (解放) します。
for (var c = 0; c < objectPool.length; c++) { if (!objectPool[c].marked) { free(objectPool[c]); remove(objectPool[c]); } }
何か不足していますか?これはすべて正しいように見えますか?