Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不清楚V8垃圾收集_Javascript_Node.js_Garbage Collection_V8 - Fatal编程技术网

Javascript 不清楚V8垃圾收集

Javascript 不清楚V8垃圾收集,javascript,node.js,garbage-collection,v8,Javascript,Node.js,Garbage Collection,V8,我很难理解V8将在Node.js中收集哪些垃圾,以及为什么(或者为什么不)。下面有一个使用async.js库的示例 我想了解一下V8如何处理下面的每种情况(注释中的数字从1到6) 提前谢谢 "use strict"; var async = require('async'); module.exports = { foo: function foo(shirt, callback) { async.series([ function(ne

我很难理解V8将在Node.js中收集哪些垃圾,以及为什么(或者为什么不)。下面有一个使用
async.js
库的示例

我想了解一下V8如何处理下面的每种情况(注释中的数字从1到6)

提前谢谢

"use strict";

var async = require('async');

module.exports = {

    foo: function foo(shirt, callback) {

        async.series([

            function(next) {

                var pants = 'clown',
                    outfit = shirt + pants;

                // 1. will shirt be garbage collected?

                next(null, outfit);

            },

            function(next) {

                var err = new Error('can\'t touch this.'),
                    pants = 'hammer',
                    outfit = shirt + pants;

                // 2. will shirt be garbage collected?

                setImmediate(function() {

                    // 3. will err be garbage collected?
                    // 4. will outfit be garbage collected?
                    // 5. will next be garbage collected?

                    next(err, outfit);

                })

            }

        ], function(err, results) {

            // 6. will callback be garbage collected?
            callback(err, results);

        });

    }


};
shirt
(1,2)和
callback
(3)都由内部函数引用。因此,它们的绑定必须是堆分配的,并且只有当所有这些内部函数都变成垃圾时才会变成垃圾。在本例中,这将发生在
async.series
完成执行并删除对存储内部函数的数组的引用之后

当然,
shirt
callback
都是参数。因此,即使当
foo
删除对其值的所有引用时,其调用者仍可能有一些,在这种情况下,这些值将保持更长的生存时间。你不可能在当地知道这一点

类似地,
err
(3)和
full
(4)只有当传递给引用它们的
setImmediate
的内部函数变成垃圾(可能在执行之后发生)并且当下一个
传递给它们的任何延续不再使它们保持活动时,才会变成垃圾。在本例中,它们被传递到
回调
参数,而您对该参数一无所知——它可以通过将它们存储在某个地方来无限期地保持它们的活性,或者直接将它们删除


最后,
next
(5)又是一个参数。它的值至少在
setImmediate
激发之前有效。但是它是一个由
async.series
创建的函数,要知道它的使用寿命,您还需要详细了解
async.series
如何处理它(我假设它会立即删除它)。

私有变量在无法访问时被收集,在您的情况下,当回调触发并且不再需要时。因此,根据答案,这里没有泄漏任何内容,除非外部的东西挂在初始
衬衫上
回调
(假设
async.series
正在删除所有引用)。谢谢