当我将一个大型视频文件从 MongoDB GridStore 对象传输到 Web 响应时,我遇到了内存泄漏问题。我正在使用快递。我的代码(为简洁起见省略了一些内容)如下:
// "res" is the response for this Express route.
// response header values are set outside this block
// gridstore, etc. are define above the part that counts, here
gridStore.open(function (err, gs) {
gs.seek(rangeObj.start, function (err, gs) {
var current = 0,
stream = gs.stream(true);
stream.pipe(res);
res.on("close", function () {
console.log("socket closed");
if(res){
res.end();
res = null;
}
if(gs){
gs.close(function(){
gs.destroy();
gs = null;
if(db){
db.close(true, function(){
db = null;
gridStore = null;
});
}
});
}
});
stream.on("end", function () {
console.log("stream ended");
if(res){
res.end();
res = null;
}
if(gs){
gs.close(function(){
gs = null;
if(db){
db.close(true, function(){
db = null;
gridStore = null;
});
}
});
}
});
stream.on("close", function(){
console.log("stream closed");
if(res){
res.end();
res = null;
}
if(gs){
gs.close(function(){
gs = null;
if(db){
db.close(true, function(){
db = null;
gridStore = null;
});
}
});
}
});
});
});
如您所见,我正在努力清理自己。在我试图追捕这个问题的过程中,里面有很多不必要的东西。虽然,也许我错过了什么
视频流很好。但是,该过程需要越来越多的内存,似乎没有上限。即使在让进程空闲数小时后,它似乎也没有释放内存。
我试过暴露垃圾收集器并在响应关闭时运行(甚至每隔 5 秒)。我还尝试使用 --always-compact 标志执行节点进程。我在 Windows 7 和 Ubuntu 12.04(两者的节点 0.10.4)中都遇到了同样的问题。