【发布时间】:2015-01-24 21:34:53
【问题描述】:
我刚刚完成了我的第一个 node.js 应用程序的开发,现在我正在我的 VPS 上对其进行测试。观察进程“节点”的资源使用情况,我注意到请求页面(尤其是某些页面)时内存使用量增加。特别是,如果请求的页面是静态页面,则增加是最小的。如果请求的页面是/admin,则增加可以是 1mb!当然,当 /admin 被请求时,我的服务器会做更多的事情而不是提供静态页面。他连接到 mongodb,执行 4 次“查找”,然后使用 bind 将结果绑定到 html 模板。现在,有什么问题?使用的这个内存,永远不会被释放!!!所以我认为我的代码中存在逻辑错误,但后来我做了另一个更有趣的测试。
考虑这个非常简单的 nodejs 服务器:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(3000, 'my_public_ip');
如果我尝试使用浏览器发出多个请求(只需按住 f5 一分钟),内存使用量会缓慢增长,并且进程使用的内存将永远不会释放,即使经过很长时间和关闭浏览器后也是如此。现在,很可能在我的 /admin 代码中存在一些错误(每个请求使用 1mb 的内存并且从未释放它非常高!),但我认为上面简单脚本使用的内存永远不会被释放,这很奇怪!你怎么看待这件事?有办法避免吗?
另外,(在我的真实服务器中),我以你的方式使用了memwatch:
var memwatch = require('memwatch');
memwatch.on('leak', function(info) {
console.log(info);
process.exit(1);
});
如果我使用浏览器执行多个请求,大约 10 秒后,我正在执行此操作,进程将退出,这是错误:
{ start: Wed Nov 26 2014 08:21:07 GMT-0500 (EST),
end: Wed Nov 26 2014 08:22:04 GMT-0500 (EST),
growth: 4775624,
reason: 'heap growth over 5 consecutive GCs (57s) - 287.65 mb/hr' }
这是什么意思??它似乎与垃圾收集器有关!我知道最好在这里粘贴我的 /admin 代码,但是 sn-p 很长并且与全局变量有关,所以如果没有 200 行的副本就无法理解:D。如果您需要更多信息,我会给您!
【问题讨论】:
-
您是否尝试手动强制垃圾回收?检查devjar.me/post/22886448979/manually-run-gc-in-node-js:“使用标志--nouse_idle_notification 和--expose_gc 启动节点,然后当您要运行GC 时,只需调用global.gc()。”
-
您可以在 gist / pastebin 中发布您的代码。但是您提到全局变量的简单事实应该会触发警报:) 我们确实需要更多信息。另外,尝试
memwatch热代码,不要在启动后立即进行。 -
我(Andras)用强制 gc 尝试了上面的代码,它非常非常渐进,但是发生了一些事情。超过 200 秒和 580,000 次调用 heapUsed 增加了 40KB(很小),但 heapTotal 增加了 12MB,先是 +4,然后是 +8。我现在跑步 5 分钟
-
我收回了,我不再认为这是泄漏。在较长时间内,内存使用看起来很稳定。
标签: node.js memory-leaks