我正在研究一些简单的脚本语言,我需要帮助理解垃圾收集器的工作原理。据我所知,垃圾收集器有两件事:
对象池 - 包含所有已分配的对象,可以表示为简单数组。当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会在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;
垃圾收集(至少标记和扫描实现)包含两个步骤:
标记:遍历框架中包含的对象并标记它们:
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]);
}
}
我错过了什么吗?这一切看起来都正确吗?