DIY脚本语言垃圾收集(标记和扫描)

时间:2014-03-20 21:13:45

标签: javascript algorithm garbage-collection mark-and-sweep

我正在研究一些简单的脚本语言,我需要帮助理解垃圾收集器的工作原理。据我所知,垃圾收集器有两件事:

  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会在Frame中创建条目。当我们需要获得变量值时,我们会在框架中查看它。帧可以表示为哈希映射:

    // 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;
    
  3. 垃圾收集(至少标记和扫描实现)包含两个步骤:

    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]);
        }
      }
      
    3. 我错过了什么吗?这一切看起来都正确吗?

0 个答案:

没有答案