gpt4 book ai didi

javascript - javascript中的关闭和回调内存泄漏

转载 作者:IT老高 更新时间:2023-10-28 22:12:42 27 4
gpt4 key购买 nike

function(foo, cb) {
var bigObject = new BigObject();
doFoo(foo, function(e) {
if (e.type === bigObject.type) {
cb();
// bigObject = null;
}
});
}

上面的例子展示了一个经典的、偶然的(或者可能不是)内存泄漏的闭包。 V8 垃圾收集器无法确定删除 bigObject 是否安全,因为它正在用于可以多次调用的回调函数中。

一种解决方案是在回调函数中的作业结束时将bigObject设置为null。但是如果你使用了很多变量(想象有 n 变量,比如 bigObject,并且它们都用在回调中),那么清理这将成为一个丑陋的问题。

我的问题是:还有其他方法可以清理那些使用过的变量吗?

编辑 这是另一个(真实世界)示例:所以我从 mongodb 获取应用程序并将其与其他应用程序进行比较。来自 mongodb 的回调使用从该回调中定义的变量应用程序。从 mongodb 获得结果后,我也将它作为回调返回(因为它都是异步的,我不能只写 return )。所以实际上可能会发生我将回调一直传播到源......

function compareApplications(application, condition, callback) {

var model = database.getModel('Application');
model.find(condition, function (err, applicationFromMongo) {
var result = (applicationFromMongo.applicationID == application.applicationID)
callback(result)
}
}

最佳答案

如果你的回调函数应该只被调用一次,那么你应该在它被调用后取消订阅。这将释放你的回调 + 对 GC 的闭包。随着你的闭包被释放,bigObject 也将被 GC 自由收集。

这是最好的解决方案 - 正如您所指出的,GC 不会神奇地知道您的回调只会被调用一次。

关于javascript - javascript中的关闭和回调内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16442201/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com