使用node.js进行垃圾回收
我很好奇嵌套函数的node.js模式如何与v8的垃圾收集器一起工作。这是一个简单的例子
readfile("blah", function(str) { var val = getvaluefromstr(str);
function restofprogram(val2) { ... } (val)
})
如果restofprogram是长时间运行的,那是否不意味着str将永远不会被垃圾回收?我的理解是,使用结点,您最终会获得很多嵌套函数。如果在外部声明了restofprogram,是否会收集垃圾,因此str不能在范围内?这是推荐做法吗?
我不想使问题复杂化。那只是粗心,所以我修改了它。
回答:
简单的答案:如果str
没有从其他任何地方引用的值(并且str
本身也没有从引用restofprogram
),则function (str) {
... }返回时将无法访问它的值。
详细说明:V8编译器区分真正的 地方 ,从所谓的变量 背景 变量被关闭,由阴影捕获 语句来或eval
调用。
局部变量存在于堆栈中,并在函数执行完成后立即消失。
上下文变量位于分配给堆的上下文结构中。当上下文结构消失时,它们消失。这里要注意的重要一点是,来自同一作用域的上下文变量位于
结构中。让我用示例代码进行说明:
function outer () { var x; // real local variable
var y; // context variable, referenced by inner1
var z; // context variable, referenced by inner2
function inner1 () {
// references context
use(y);
}
function inner2 () {
// references context
use(z);
}
function inner3 () { /* I am empty but I still capture context implicitly */ }
return [inner1, inner2, inner3];
}
在这个例子中变量x
将尽快消失outer
的回报,但变量y
,并z
只有当将消失 inner1
,inner2
inner3
死。发生这种情况是因为y
和z
分配在相同的上下文结构中,并且所有三个闭包都隐式引用此上下文结构(即使inner3
没有显式使用它)。
当你开始使用情况变得更加复杂 语句来, ,其在V8中包含一个隐含的语句来
语句来里面的catch子句或全局eval
。
function complication () { var x; // context variable
function inner () { /* I am empty but I still capture context implicitly */ }
try { } catch (e) { /* contains implicit with-statement */ }
return inner;
}
在此示例中,x
仅在inner
死亡时才会消失。因为:
- catch-在catch子句中 -statement 隐式
- V8假定任何 -statement的语句都会遮盖 所有 本地人
这迫使x
成为上下文变量并inner
捕获上下文,x
直到上下文inner
消失为止。
通常,如果您要确保给定的变量保留某个对象的时间不超过实际需要的时间,则可以通过分配给该变量轻松地 破坏 此链接null
。
以上是 使用node.js进行垃圾回收 的全部内容, 来源链接: utcz.com/qa/413639.html