首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NodeJS : How to debug“检测到EventEmitter内存泄漏。添加了11个侦听器”

NodeJS : How to debug“检测到EventEmitter内存泄漏。添加了11个侦听器”
EN

Stack Overflow用户
提问于 2013-03-23 08:35:14
回答 8查看 79.6K关注 0票数 55

如何调试抛出此错误的应用程序:

代码语言:javascript
复制
(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at Socket.EventEmitter.addListener (events.js:160:15)
    at Socket.Readable.on (_stream_readable.js:653:33)
    at Socket.EventEmitter.once (events.js:179:8)
    at TCP.onread (net.js:527:26)

我找不到假设的通过.setMaxListeners(0);增加监听器限制的泄漏对象

解决方案(来自fardjad和jan salawa)

通过jan salawa的搜索,我找到了一个可以增加堆栈跟踪冗余的工作库(longjohn)。有了fardjad的响应,我发现我们必须构建EventEmitter.addListener EventEmitter.on的原型。

有了这个解决方案,我就可以得到这个新的跟踪:

代码语言:javascript
复制
(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at EventEmitter.addListener.EventEmitter.on (xxx/main.js:44:15)
    at Readable.on (_stream_readable.js:653:33)
    at ServerResponse.assignSocket (http.js:1072:10)
    at parser.onIncoming (http.js:1979:11)
    at parserOnHeadersComplete (http.js:119:23)
    at socket.ondata (http.js:1912:22)
    at TCP.onread (net.js:510:27)
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-04-26 02:28:30

原来这是nodejs核心中的一个bug,我们在这里讨论这个问题:https://github.com/joyent/node/issues/5108

针对出现错误的http服务器的解决方案,抛出 EventEmitter memory leak detected 并填满可用内存/可用CPU时间:

恢复到旧版v0.8.23。(你可以从这里下载并安装/编译它:http://blog.nodejs.org/2013/04/08/node-v0-8-23-legacy/)

UPDATE 2018 :我在这个话题上看到了几次反馈,而这个问题看起来已经多年没有了。请注意,对于使用nodejs构建的泄漏http服务器,此响应仅为。如果您在其他情况下,请查看此帖子上的其他回复,不要降低您的版本(如此回复中所建议的),这将浪费您的时间。

票数 32
EN

Stack Overflow用户

发布于 2013-03-25 22:49:33

对我来说,看起来你的事件循环被阻塞了。如果您在node.js事件循环中执行cpu密集型任务,则可能会发生这种情况。您可以使用child process来执行密集型任务。

您可以使用following methods检查是什么阻止了node.js

每次调用的

  1. Measure computation time。Log if time is loop,所以你知道应用程序正在misbehaving.
  2. Set一个日志调度,这样你就知道什么时候有阻塞循环

profile.

  • Use timeTick() { var startTime = (new Date().getTime());function onTick() { var interval = (new Date().getTime()) - startTime;if(interval > 5) console.log('timeTick():WARNING: interval =‘+ interval);} process.nextTick(onTick);} setInterval(timeTick,1000);

  • 使用interval this进行日志记录和分析。它是在.

中使用的库

票数 12
EN

Stack Overflow用户

发布于 2014-03-22 09:30:56

这正是发生在我身上的事情。对我来说,我意外地将一个事件侦听器嵌套在另一个事件侦听器中。

例如,查看您的代码并确保在另一个事件侦听器块中没有事件侦听器块(除非您是故意这样做的):

代码语言:javascript
复制
socket.on('data', function(data) {
//code goes here

socket.on('close' , function() {
//code goes here
     });

   });

在上面的错误示例中,socket.on ('close')侦听器应该位于socket.on('data')块的外部。

在我的例子中,当我收到5个数据流时,socket.on(' close ')侦听器正在等待一个close事件发生。当我关闭一次,另一个关闭事件将执行。这显然不是我想要的。这是由于Node.js是非阻塞的。由于回调函数,它会“记住”事件。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15581978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档