不清楚V8垃圾收集

时间:2015-04-24 19:23:09

标签: 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(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);

        });

    }


};

1 个答案:

答案 0 :(得分:4)

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

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

类似地,err(3)和outfit(4)只有当内部函数传递给引用它们的setImmediate变成垃圾时才会变成垃圾(这可能会在之后发生)它被执行了),当任何延续next传递给他们时,不再让他们活着。在这个例子中,它们被传递给你不了解的callback参数 - 它可以通过将它们存放在某个地方而无限期地保持活着,或者只是立即丢弃它们。

最后,next(5)再次成为一个论点。它的价值至少会持续到setImmediate点火。但它是async.series创建的一个函数,并且知道它存在多久,并且还详细了解async.series如何处理它(我假设它立即丢弃它)。