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 に答える