如何调试我的应用程序,它抛出这个错误:
(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的使用下面的方法 :
- 测量计算时间每次通话的。 如果登录时间是很高,所以你知道应用程序行为不正常。
- 建立日志时间表,让你知道当东西挡住环
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);
- 使用配置文件。
- 使用此日志记录和分析。 这是在使用图书馆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”