当前位置: 首页 > 知识库问答 >
问题:

如何在node.js中跟踪堆内对象以发现内存泄漏?

益清野
2023-03-14

我有内存泄漏,我知道它在哪里(我想是这样的),但我不知道为什么会发生。负载测试以下endpoint(使用restify.js服务器)时发生内存泄漏:

server.get('/test',function(req,res,next){
    fetchSomeDataFromDB().done(function(err,rows){
        res.json({ items: rows })
        next()
    })
})

我非常肯定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()
    })
})

因此,在每个请求中,我都将big object分配给res对象作为其属性。我观察到,有了这个附加属性,内存增长得快得多。在60秒内每完成1000个请求,内存会增加100MB。在下一次相同的测试之后,内存再次增长100MB,以此类推。现在,当我知道res对象没有被“释放”时,我如何跟踪什么仍然保持对res的引用?假设我将执行堆快照--如何找到引用RE的内容?

10个请求之间的堆对比截图:

实际上,instance.dao似乎正在泄漏??这个类属于ORM,我正在使用它来查询DB...你觉得呢?

多一个按#delta排序的相同coparison屏幕:

共有1个答案

皇甫展
2023-03-14

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

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

 类似资料:
  • 问题内容: 我们有一个App Engine应用程序,可将许多较大文件写入Google Cloud Store。这些文件是动态创建的CSV文件,因此我们将Python用作缓冲区和写入该缓冲区的接口。 通常,我们的过程如下所示: 据我们了解,它们本身不需要关闭。而是,仅上述内容和需要被关闭。 我们在由App Engine的任务队列调用的中运行上述过程。最终,在几次调用我们的任务后,我们得到以下错误:

  • 我试图在我们非常小且简单的Spring Boot应用程序中跟踪并确定内存泄漏的根本原因。 它使用以下内容:-Spring Boot 2.2.4-azure servicebus jms Spring Boot starter 2.2.1-MSSQL 功能:该应用程序只发送Azure ServiceBus队列,存储数据并将数据发送到其他目的地。这是一个小应用程序,所以它很容易启动64兆的内存,尽管我

  • 我们有一个应用程序引擎应用程序,它将许多相对较大的文件写入谷歌云商店。这些文件是动态创建的CSV,因此我们使用Python的作为写入该缓冲区的接口。 通常,我们的流程如下所示: 据我们所知,不需要自己关闭。相反,只需要关闭上面的和。 我们在appengine的任务队列调用的

  • 我已经在我的机器(ubuntu)中安装了Clang,以便在我的C代码中查找内存泄漏。我写了一个示例代码来检查它的工作情况,如下所示: 我在互联网上找到了一些编译选项 和 但它们都没有出现内存泄漏的迹象。 扫描构建:使用“/usr/bin/clang”进行静态分析 扫描构建:删除目录“/tmp/scan-build-2015-07-02-122717-16928-1”,因为它不包含报告 扫描构建:未

  • 问题内容: 是否有一些工具可以检测Node.js中的内存泄漏?并告诉我您在测试nodejs应用程序方面的经验。 问题答案: 以下工具对于发现内存泄漏很有用: 节点检查器 还有一个教程可以帮助您在此处查找内存泄漏: https://github.com/felixge/node-memory-leak- tutorial

  • 问题内容: 我们知道node.js为我们提供了强大的功能,但强大的功能带来了巨大的责任。 据我所知,V8引擎不进行任何垃圾收集。因此,我们应该避免什么最常见的错误,以确保没有内存从节点服务器泄漏。 编辑: 对不起,V8确实具有强大的垃圾收集器。 问题答案: 据我所知,V8引擎不进行任何垃圾收集。 V8内置了强大而智能的垃圾收集器。 您的主要问题是不了解闭包如何维护对外部函数的范围和上下文的引用。这