1

私は単純なスクリプト言語に取り組んでおり、ガベージ コレクターのしくみを理解するのに助けが必要です。私が理解している限り、ガベージコレクターには2つのことがあります。

  1. オブジェクト プール - 割り当てられたすべてのオブジェクトが含まれ、単純な配列として表すことができます。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);
    
  2. フレーム (正しい用語かどうかは不明) - 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 つの手順が含まれます。

  1. マーク: フレームに含まれるオブジェクトをウォークスルーし、それらをマークします。

    for (var varName in frame)
      frame[varName].marked = true;
    
  2. スイープ: objectPool に含まれるオブジェクトをウォークスルーし、マークされていないオブジェクトをすべて削除 (解放) します。

    for (var c = 0; c < objectPool.length; c++) {
      if (!objectPool[c].marked) {
        free(objectPool[c]);
        remove(objectPool[c]);
      }
    }
    

何か不足していますか?これはすべて正しいように見えますか?

4

0 に答える 0