我对 node.js 比较陌生,我的任务是编写一个简单的消息队列应用程序 - 基本上,该应用程序将收到一个包含一些消息数据和客户端 mac 地址的帖子,我们将其解码然后插入到sqlite 数据库,稍后由单独的进程发布。
一切正常,但我们遇到了可能是内存泄漏的情况。使用 memwatch 模块,我将泄漏范围缩小到处理传入帖子的代码,我将其包括在下面:
app.route('*')
.post(function(req, res){
var mac = decodeURI(unescape(req.param('mac').replace(/\+/g, "%20")));
var data = decodeURI(unescape(req.param('data').replace(/\+/g, "%20")));
req = null;
db.run("INSERT INTO queue (mac, data) VALUES (?,?)", [mac, data], function(er){
if(er) {
res.writeHead(500, "Insert to queue failed", {'Content-Type': 'text/html'});
res.end();
} else {
res.writeHead(200, "OK", {'Content-Type': 'text/html'});
res.end();
}
res = null;
mac = null;
data = null;
});
})
我在这里找不到任何看起来不正确的东西,但是当我们向应用程序发布 10000 个请求时,我们几乎总是在 memwatch 中触发内存泄漏事件。我在这里寻找正确方向的推动力:我们只是误解了 memwatch,还是这里有泄漏我以某种方式错过了?据我了解,memwatch 认为连续 5 次或更多 V8 垃圾收集尝试的堆增长是泄漏 - 似乎有可能像这样一次有 10000 个帖子,这种堆增长是可以预期的,但我还没有发现一个明确的答案,需要排除它。任何帮助,即使你只是指出我正确的方向,将不胜感激!