2

在此先感谢您的帮助。当有循环引用时,Node.js console.log(util.inspect(ctx)) 将转储出 [Circular] 例如

如果这会导致堆栈溢出或内存问题,是否应该完全避免循环引用?

如果我们有一个包含循环引用的循环,但我们在退出循环之前将对象设置为 null,那么垃圾收集器不应该清理存储,并且我们不应该有任何内存不足或堆栈溢出问题吗?

    function run() {
    var obj = {}, ctx = vm.createContext({});

    obj.__ctx = ctx;
    ctx.__obj = obj;
    //console.log("before:"+util.inspect(obj));
    //console.log("before:"+util.inspect(ctx));
    vm.Script.runInContext('var x = +1;', ctx);
    console.log(util.inspect(ctx));
    console.log(util.inspect(obj));
    ctx = null;
    obj = null;


     }

     for (var i = 0; i < 10000; i += 1) {

     run();
     //sys.log(sys.inspect(process.memoryUsage()));

     }
4

1 回答 1

1

不,除非您持有对函数范围之外的对象的引用,否则这不会导致内存问题。按照它的编写方式,这两个对象只要设置为 null 就可以进行垃圾回收。

console.log() 方法只会给出循环错误,因为尝试写出对象图会导致无限循环,所以它只是简单地回复[Circular]

于 2013-09-06T15:43:41.267 回答