我很难绕着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);
});
}
};
答案 0 :(得分:4)
shirt
(1,2)和callback
(3)都由内部函数引用。因此,它们的绑定必须是堆分配的,并且只有当所有内部函数都变成垃圾时才会变成垃圾。在这个例子中,这将在async.series
完成执行后发生,并删除对存储内部函数的数组的引用。
当然,shirt
和callback
都是参数。因此,即使foo
删除了对其值的所有引用,其调用者仍可能仍然有一些,在这种情况下,这些值将保持更长时间。你不能在当地知道。
类似地,err
(3)和outfit
(4)只有当内部函数传递给引用它们的setImmediate
变成垃圾时才会变成垃圾(这可能会在之后发生)它被执行了),当任何延续next
传递给他们时,不再让他们活着。在这个例子中,它们被传递给你不了解的callback
参数 - 它可以通过将它们存放在某个地方而无限期地保持活着,或者只是立即丢弃它们。
最后,next
(5)再次成为一个论点。它的价值至少会持续到setImmediate
点火。但它是async.series
创建的一个函数,并且知道它存在多久,并且还详细了解async.series
如何处理它(我假设它立即丢弃它)。