如何在node.js中跟踪堆内的对象以查找内存泄漏?

如何在node.js中跟踪堆内的对象以查找内存泄漏?,node.js,memory-leaks,Node.js,Memory Leaks,我有内存泄漏,我知道它在哪里(我想是的),但我不知道为什么会发生。 在对以下端点进行负载测试时发生内存泄漏(使用restify.jsserver): 我非常确定res对象没有被(垃圾收集器)处理。每次请求时,应用程序使用的内存都在增长。我做了一些额外的测试: var data = {} for(var i = 0; i < 500; ++i) { data['key'+i] = 'abcdefghijklmnoprstuwxyz1234567890_'+i } server.get

我有内存泄漏,我知道它在哪里(我想是的),但我不知道为什么会发生。 在对以下端点进行负载测试时发生内存泄漏(使用
restify.js
server):

我非常确定
res
对象没有被(垃圾收集器)处理。每次请求时,应用程序使用的内存都在增长。我做了一些额外的测试:

var data = {}
for(var i = 0; i < 500; ++i) {
    data['key'+i] = 'abcdefghijklmnoprstuwxyz1234567890_'+i
}
server.get('/test',function(req,res,next){
    fetchSomeDataFromDB().done(function(err,rows){
        res._someVar = _.extend({},data)
        res.json({ items: rows })
        next()
    })
})
var data={}
对于(变量i=0;i<500;++i){
数据['key'+i]='abcdefghijklmnoprstuwxyz1234567890_'+i
}
get('/test',函数(req,res,next){
fetchSomeDataFromDB().done(函数(错误,行){
res._someVar=u.extend({},数据)
res.json({items:rows})
下一个()
})
})
因此,在每个请求中,我都将大对象指定给
res
对象作为其属性。我观察到,有了这个额外的属性,内存增长得更快。在60秒内,每完成1000个请求,内存就会增加100Mb。在下一次相同的测试之后,内存再次增长100mb,以此类推。现在,当我知道res对象没有被“释放”时,我如何跟踪什么仍然保留对res的引用?比如说,我将执行堆快照-我如何找到什么是referecing res


10个请求之间堆比较的屏幕截图:

实际上,
Instance.DAO
似乎在泄漏??这个类属于我用来查询数据库的ORM。。。你觉得怎么样

按#delta排序的同一配对的另一个屏幕:


由于您没有在该代码的任何地方泄漏
res
,GC似乎更可能尚未收集对象。尝试使用
--expose gc
节点参数运行脚本,然后设置定期调用
gc()的间隔。这将迫使GC运行,而不是懒惰


如果在此之后您发现确实存在内存泄漏,您可以使用模块之类的工具使用Chrome developer堆检查器查看哪些对象占用了空间。

我已经尝试了
gc()
。如果在每次请求后调用gc,内存仍然会增加,但速度会变慢,因为请求需要更多的时间。还尝试在内存达到200MB后调用
gc
-不工作,内存仍在泄漏。我还使用了很多可能有bug的中间件。从上个星期开始,我一直在努力解决这个问题,但运气不好。我还检查了chrome中的heapdump,但它没有告诉我任何事情(
数组增加了吗?)如果您已经尝试了所有这些,那么我会说您的内存泄漏在别处,与您在问题中显示的代码块不同。是的,我怀疑出于某种原因,
res
是从某个根引用的,并且不是垃圾收集的。但我想不出是什么原因。。。我不能把代码放在这里,因为它现在是一个相当大的应用程序…我用heapdump比较的屏幕截图更新了我的问题-你怎么看?
var data = {}
for(var i = 0; i < 500; ++i) {
    data['key'+i] = 'abcdefghijklmnoprstuwxyz1234567890_'+i
}
server.get('/test',function(req,res,next){
    fetchSomeDataFromDB().done(function(err,rows){
        res._someVar = _.extend({},data)
        res.json({ items: rows })
        next()
    })
})