gpt4 book ai didi

javascript - 我应该担心清理 Node.js 中的大对象还是留给垃圾收集器?

转载 作者:搜寻专家 更新时间:2023-10-31 22:48:11 24 4
gpt4 key购买 nike

最近我遇到了一个 node.js API 的问题,我的内存随着每个请求而变得越来越大。我在 Heroku 上使用他们的免费版本托管我的服务器,该版本只有 512MB 的 RAM。在周末流量很大之后,我开始收到来自 Heroku 的超出内存错误,因此我开始在我的代码中搜索内存泄漏,但无济于事。我没有保留任何元素,一切都应该被清理干净,坦率地说,我迷路了。

但是,经过一些研究后,我发现 node.js 会在达到 max-old-space-size 变量时运行垃圾收集器,并且在 64 位系统上默认为 1024MB。我已将其设置为 410(可用内存的 80%),但想知道我是否应该只在代码中处理它?显然,升级我的实例并仅具有正常的默认上限是理想的选择,但现在这不是一个选项。

示例:

// lets assume there is some apiGet function
// that calls back with a very very large object with
// the following structure:
// {
// status: "success",
// statusCode: 200,
// messages: [],
// data: { users: [ huge array of users ] }
// }
// we have a manipulateData function that's going
// to do some stuff to the returned data and the
// call some callback to give the data to the caller
function manipulateData(callback) {
apiGet(function(error, veryLargeObject) {
var users = veryLargeObject.data.users;
var usefulUsers = users.map(function(user) {
// do some data calculations here and then
// return just those properties we needed
});

callback(null, usefulUsers)
});
}

所以在这个例子中,一旦 manipulateData 完成运行,如果我理解正确,“veyLargeObject”现在将被设置为垃圾收集,因为没有更多的指针可以访问它(返回的 usefulUsers 是 map 创建的新数组)。但这并不一定意味着它占用的所有内存都是空闲的,对吗?在调用回调之前设置 veryLargeObject = null 或 undefined 是否明智?

我希望我问的是有道理的。基本上:当不再打算使用大对象时,将大对象设置为 null 或 undefined 是个好主意,还是应该将它们留给垃圾收集器清理?当您只获得 512MB RAM 与 8GB RAM 时,这个问题的答案会改变吗?

最佳答案

如果您确定不再需要给定对象,则将其设置为 null 是可行的方法(请注意,这并不意味着任何链接对象也将被垃圾收集到)。只有当对该给定对象的所有引用都设置为 null 时(该对象在您的代码中的任何地方都变得不可访问),它才会被收集。

由于 node.js 在底层使用 V8 引擎,您可以获得一些关于如何改进垃圾收集的提示 A tour of V8: Garbage Collection .如果这还不够,您可以按照 these instructions 强制 GC .

关于javascript - 我应该担心清理 Node.js 中的大对象还是留给垃圾收集器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28818611/

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