Javascript 识别内存泄漏

Javascript 识别内存泄漏,javascript,node.js,memory-leaks,closures,Javascript,Node.js,Memory Leaks,Closures,我目前正在编写一个简单的api,其中发布一个数组长度=200,由于数组中的每个元素都需要执行1-2个查找请求,因此我使用异步库来控制数据流。我正在使用node 0.12.5和Express router.post'/data',functionreq,res,next{ var cloudDB=db.cloudant.use'events'; var tempStorage={docs:[]}; //每个循环都是为了确保在提交响应之前遍历所有事件 async.eachreq.body、funct

我目前正在编写一个简单的api,其中发布一个数组长度=200,由于数组中的每个元素都需要执行1-2个查找请求,因此我使用异步库来控制数据流。我正在使用node 0.12.5和Express

router.post'/data',functionreq,res,next{ var cloudDB=db.cloudant.use'events'; var tempStorage={docs:[]}; //每个循环都是为了确保在提交响应之前遍历所有事件 async.eachreq.body、functionsingleEvent、loopCallback{ //这应该是异步瀑布或更好的东西来组织它 异步瀑布 [ functioncallback{//从数据库获取用户数据 db.getUserInfosingleEvent.email,函数错误,dbResponse{ 对不起,休斯顿,我们有个问题 返回回调错误; } 返回callbacknull,dbResponse; } }, functiondbResponse,回调{//决定如何处理结果 如果!dbResponse{//我们无法从数据库中获取用户 db.searchForUsersingleEvent.email,函数错误,searchResponse{ 伊弗 返回callbackerr; 其他的 返回callbacknull,JSON.parsesearchResponse; } } 否则{ 返回callbacknull,JSON.parsedbResponse; } }, functionuserInfo,回调{//将数据合并到正确的逻辑中 callbacknull、CombineeEvent和UserDataSingleEvent、userInfo; } ], 函数错误、结果错误{ //已处理用户事件,因此如果没有错误,让我们将其添加到队列中 伊弗{ console.logerr; } 否则{ tempStorage.docs.pushresult; } loopCallback;//我们已经完成了这个singleEvent } },functionerr{//当所有singleEvents都循环通过时调用函数 console.logFinished各一个; 伊弗{ res.status500.senderr; } 否则{ cloudDB.bulktempStorage,functionerr,body{ 如果{ res.status200.sendbody; } 否则{ res.status500.senderr; } } } }; }; 所以,这段代码有效!然而嗅嗅嗅嗅,我好像造成了内存泄漏。我已经查看了和,我所能看到的是,当我查看堆转储时,“数组”不断增长


我不知道为什么,但我怀疑这可能与闭包以及我如何存储从每个瀑布生成的项目有关,也许还有tempStorage.docs没有发布?我是否以正确的方式存储tempStorage?或者我应该改变我的做法吗?

我对Node不太了解,但如果您怀疑它与未释放tempStorage有关,您可以尝试手动删除引用,也可以尝试手动调用垃圾收集器。看看这是否有区别。只要你的异步操作没有被卡住,也没有调用它们的完成回调,我就看不到任何内存泄漏。此闭包仅在其中包含引用的异步操作处于活动状态时持续。完成后,包含tempStorage对象的请求作用域应该被垃圾收集。@Tim-您不需要手动释放Javascript中的局部变量,也不需要手动释放。而且,在使用异步操作时,没有理由在Javascript中手动调用垃圾收集器,因为它有足够的时间自行运行。我认为我们还没有任何证据表明tempStorage对象实际上是罪魁祸首。@jfriend00这是真的,但您可以“释放”引用:tempStorage=null;。就像我说的:我对Node和异步特性了解不多。@Tim-这是一个公平的测试,只是一个调查,而不是一个实际的解决方案。