nodejs setMaxListeners 避免内存泄漏检测

Posted

技术标签:

【中文标题】nodejs setMaxListeners 避免内存泄漏检测【英文标题】:nodejs setMaxListeners to avoid memory leak detection 【发布时间】:2013-12-02 17:02:52 【问题描述】:

我阅读了一些其他问题和帖子,但找不到在哪里应用 .setMaxListeners(0)。 我正在使用一个简单的 websocket-server,它会出现错误:

(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:689:33)
at XHRPolling.Transport.setHandlers            (D:\nodeJS\host\node_modules\socket.io\lib\transport.js:116:15)
at XHRPolling.HTTPPolling.setHandlers        (D:\nodeJS\host\node_modules\socket.io\lib\transports\http-polling.js:53:39)
at XHRPolling.Transport.handleRequest (D:\nodeJS\host\node_modules\socket.io\lib\transport.js:70:10)
at XHRPolling.HTTPTransport.handleRequest (D:\nodeJS\host\node_modules\socket.io\lib\transports\http.js:84:39)
at XHRPolling.HTTPPolling.handleRequest (D:\nodeJS\host\node_modules\socket.io\lib\transports\http-polling.js:73:41)
at XHRPolling.Transport (D:\nodeJS\host\node_modules\socket.io\lib\transport.js:31:8)
at XHRPolling.HTTPTransport (D:\nodeJS\host\node_modules\socket.io\lib\transports\http.js:29:13)
at XHRPolling.HTTPPolling (D:\nodeJS\host\node_modules\socket.io\lib\transports\http-polling.js:27:17)

我正在以这种方式实例化路由器:

var app = require('http').createServer(handler)
, io = require('socket.io').listen(app,  log: false )
, fs = require('fs');
app.listen(8070);

然后我正在监听传入的套接字请求:

io.sockets.on('connection', function (socket) 

       socket.on('createTake', function(data)...
);

我可以在哪里应用 MaxListener?

我已经试过了:

io.sockets.on(...).setMaxListeners(0);

但它不起作用。

【问题讨论】:

【参考方案1】:

您正在将侦听器附加到 io.sockets (io.sockets.on(...))。您应该将 setMaxListeners 应用于同一个对象(到 EventEmmiter)。所以试试:

io.sockets.setMaxListeners(0);

【讨论】:

tyvm。我只是无法想象在哪里设置它。现在它可以工作了:) 欢迎您。但不要轻易忽视这个警告。当不再需要监听器时,检查是否不应该在代码中的某处删除监听器。如果您只需要对事件做出一次反应,请使用 io.sockets.once(...)【参考方案2】:

这由“maxListeners”选项控制。您有 2 种方法:完全禁用内存泄漏(我不建议这样做)或增加 maxListeners。

1.为了保持功能活跃,不要太激进:

默认值为 10,增加此值以保持内存泄漏检测处于活动状态,但不那么激进。输入您需要的任何数字。如果您实际上不知道您将使用多少个听众,我将从小步骤开始。错误地,您得到了当时您附加了多少听众的数字。

io.sockets.setMaxListeners(15);

2。完全禁用内存泄漏功能:

io.sockets.setMaxListeners(0);

其他相关提示:

获取当前值:

io.sockets.getMaxListeners();

如果您只需要对事件做出一次反应,请使用 io.sockets.once(...) 它将删除未使用的侦听器。 tomekK

【讨论】:

是否有我可以收听的事件,以便我可以知道何时达到此最大监听器。 您可以等待内存泄漏错误消息warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. Trace,然后按您的意愿处理。 我应该听什么事件 @SanthoshSKashyap 没有。只需捕获错误并解析消息,如果这不是您正在等待的错误,请再次抛出它。这可能会有所帮助:***.com/questions/7310521/…

以上是关于nodejs setMaxListeners 避免内存泄漏检测的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs事件模块小实例

警告:发生节点 apnemitter.setMaxListeners()

node.js - 请求 - 如何“emitter.setMaxListeners()”?

MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏。添加了 11 个消息列表。使用emitter.setMaxListeners() 增加限制

Socket.io 聊天应用程序显示检测到 EventEmitter 内存泄漏。增加了 11 位听众。使用发射器.setMaxListeners()

如何避免nodejs循环上的429