检测代码中的 node.js/javascript 内存泄漏
Posted
技术标签:
【中文标题】检测代码中的 node.js/javascript 内存泄漏【英文标题】:Detect node.js/javascript memory leak in code 【发布时间】:2013-03-21 08:27:01 【问题描述】:我有 some code 正在工作,但是它有内存泄漏。
在 node.js 中跟踪内存泄漏有哪些好的策略?
查找此类泄漏时应遵循哪些步骤?
如何跟踪代码中的泄漏?
谢谢
【问题讨论】:
【参考方案1】:您可以通过分析应用程序的内存使用情况来解决这个问题。
javascript 对象是在堆上分配的,因此您需要一个可以转储堆的工具。获取堆转储后,您可以检查它并查看给定对象(或函数)的实例存在多少。
例如,对于您的代码,您知道每当用户连接时都会创建一个套接字。在连接三个用户时转储堆应该显示约 3 个套接字。在这些用户断开连接后转储堆应该显示 ~0 个套接字。
您实际上可以将 Chrome 堆转储分析器与 Node.js 堆转储一起使用。
有关 Chrome 堆转储分析器的文档:https://developers.google.com/chrome-developer-tools/docs/heap-profiling
允许您获取 Node.js 堆转储并在 chrome 中检查它们的项目:https://github.com/bnoordhuis/node-heapdump
仅供参考,函数将显示在(closure)
部分下的堆转储中。
您需要确保为函数命名(即使它们不需要名称),以便它们在堆转储中显示为有用的东西。
例如,类似
function()
只会在堆转储中显示为function()
。其中:
function taggedFunction()
将在堆转储中显示为function taggedFunction()
。如果您创建 100 个 taggedFunction,那么您将在堆转储中看到 100 次 taggeFunction。基本上,命名你的函数可以让你弄清楚你是否继续创建和泄漏它们。
【讨论】:
+1 以获得良好的链接和对 OP 代码的建设性批评的好答案 setInterval 应该对每个连接都是通用的。它用于为每个用户显示相同的时间。也许还有另一种方法? 啊。是的,你的 setInterval 实际上很好。我没有看到interval
变量在全局范围内,并且只设置了一次。我认为正在为每个连接创建一个间隔。
我的脚本在连接 100 个客户端时占用 1.5GB 内存。
我从 socket.io 切换到 socks.js 并且我没有内存泄漏了。以上是关于检测代码中的 node.js/javascript 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
使用 Javascript/Node.js 在代码中执行 mongoimport
用于测试点是不是在 geojson 多多边形中的 Node.js/Javascript 库
我如何在 Node.js (JavaScript) 中等待? l 需要暂停一段时间