的NodeJS:如何调试“EventEmitter内存泄漏检测。 11个听众添加”(NodeJS

2019-07-22 19:37发布

如何调试我的应用程序,它抛出这个错误:

(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先生)

随着一月Salawa先生的搜索,我发现一个工作库( longjohn )的详细增加堆栈跟踪。 随着fardjad的回应,我发现,我们有原型EventEmitter.addListener EventEmitter.on

通过该解决方案,我可以得到这个新的跟踪:

(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)

Answer 1:

事实证明,这是核心的NodeJS的错误,我们在这里谈论这个问题: 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:我看到有关这个主题的几个反馈,而这个问题看起来因为年内消失。 需要注意的是这种反应仅仅一个漏水的HTTP服务器构建具有的NodeJS。 如果你在其他情况下,请看看在此线程的其他人的反应和不降级版本(此响应的建议),你会浪费你的时间。



Answer 2:

对我来说这看起来像你的事件循环受阻。 如果你是在Node.js的事件循环做CPU密集型任务就会发生这种情况。 您可以使用子进程做密集型任务。

您可以检查什么阻止Node.js的使用下面的方法 :

  1. 测量计算时间每次通话的。 如果登录时间是很高,所以你知道应用程序行为不正常。
  2. 建立日志时间表,让你知道当东西挡住环
     function 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); 
  3. 使用配置文件。
  4. 使用此日志记录和分析。 这是在使用图书馆Nodejitsu


Answer 3:

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

看看你的代码,并确保你没有一个事件侦听器块内,例如另一个事件监听器模块(除非你是有意的):

socket.on('data', function(data) {
//code goes here

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

   });

另外,在上述错误的例子中,socket.on(“关闭”)监听器应该是socket.on(“数据”)块的外部。

在当我收到5个的数据流时,socket.on我的情况(“亲密”)监听器正在等待关闭事件发生。 当我关闭一次,另4日收盘事件将执行。 这显然不是我想要的。 这是由于Node.js的性质,其是非阻塞的。 据“记住”事件,由于回调函数。



Answer 4:

我试图将原型为EventEmitter添加日志消息到的addListener,但我不能让它工作

挂钩addListener你可以做这样的事情:

// on the first line of your main script
var events = require("events"),
    EventEmitter = events.EventEmitter;

var originalAddListener = EventEmitter.prototype.addListener;
EventEmitter.prototype.addListener = function (type, listener) {
    if (this.listenerCount(this, type) >= 10) {
        // TODO: PLACE YOUR CODE FOR DEBUGGING HERE
    }
    originalAddListener.apply(this, arguments);
}


Answer 5:

如果您注册一个相同的对象超过11倍的特定事件,此警告将被抛出。

检查是否有“上”呼吁,在你经常调用的函数particualr事件有,这导致多次注册一个事件。

此链接帮助我理解这一点。



Answer 6:

由于节点6,你应该使用node --trace-warnings : https://nodejs.org/api/cli.html#cli_trace_warnings



Answer 7:

我遇到了同样的问题,在测试时使用做出反应 摩卡成分。

我能够明确地卸载组件来解决我的问题,我已经完成了他们的测试后。

问题是,我多次安装组件在我的测试,然后将其添加更多的听众,听众之前的数量得到了11,我得到了一个警告。

我通过添加rendered.unmount()行改变了我的测试代码。 这解决了这个问题对我来说。

describe('<CircleArc />', () => {

    it('renders', function () {
        const rendered = mount(<CircleArc />);
        assert.ok(rendered.find('path'));
        rendered.unmount();
    });
}


文章来源: NodeJS : How to debug “EventEmitter memory leak detected. 11 listeners added”