nodejs setMaxListeners可以避免内存泄漏检测

时间:2013-11-19 08:26:33

标签: node.js socket.io

我读了一些其他问题和帖子,但我找不到应用.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){...}
});

我可以在哪里应用MaxListeners?

我已经尝试过了:

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

但它不起作用。

2 个答案:

答案 0 :(得分:7)

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

io.sockets.setMaxListeners(0);

答案 1 :(得分:1)

这是由" maxListeners"选项。您有两种方法:完全禁用内存泄漏(我不建议这样做)或增加maxListeners。

<强> 1。要保持功能活跃,请不要过于激进:

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

io.sockets.setMaxListeners(15);

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

io.sockets.setMaxListeners(0);

其他相关提示:

获取当前值:

io.sockets.getMaxListeners();

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