jma*_*ell 5 javascript garbage-collection v8 node.js
最近我遇到了一个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)
});
}
Run Code Online (Sandbox Code Playgroud)
所以在这个例子中,一旦完成了manipulateData的运行,如果我理解正确的话,"veyLargeObject"现在将被设置为垃圾收集,因为没有更多的指针可以访问它(返回的有用的用户是一个新的数组)由地图创建).但这并不一定意味着它占用的所有内存都是免费的,对吗?在调用回调之前设置veryLargeObject = null或undefined是否明智?
我希望我所要求的是有道理的.基本上:当没有意图再使用它们时,将大对象设置为null或undefined是一个好主意还是应该留下来让垃圾收集器清理?当你只有512MB的RAM而不是8GB的RAM时,这个问题的答案会改变吗?
如果您确定不再需要给定的对象,那么将其设置为 null 是可行的方法(请注意,这并不意味着任何链接的对象也将被垃圾收集)。仅当对该给定对象的所有引用都设置为 null(从代码中的任何位置都无法访问该对象)时,才会收集该对象。
由于 Node.js 在底层使用 V8 引擎,因此您可以获得一些有关如何改进垃圾收集的提示V8 之旅:垃圾收集。如果这还不够,您可以按照以下说明强制执行 GC 。
| 归档时间: |
|
| 查看次数: |
2109 次 |
| 最近记录: |