nodejs setMaxListeners to avoid memory leak detection
我读了一些其他问题和帖子,但我找不到应用.setMaxListeners(0)的位置。
我正在使用一个简单的websocket-server,它提出了错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | (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: odeJS\host ode_modules\socket.io\lib\transport.js:116:15) at XHRPolling.HTTPPolling.setHandlers (D: odeJS\host ode_modules\socket.io\lib\transports\http-polling.js:53:39) at XHRPolling.Transport.handleRequest (D: odeJS\host ode_modules\socket.io\lib\transport.js:70:10) at XHRPolling.HTTPTransport.handleRequest (D: odeJS\host ode_modules\socket.io\lib\transports\http.js:84:39) at XHRPolling.HTTPPolling.handleRequest (D: odeJS\host ode_modules\socket.io\lib\transports\http-polling.js:73:41) at XHRPolling.Transport (D: odeJS\host ode_modules\socket.io\lib\transport.js:31:8) at XHRPolling.HTTPTransport (D: odeJS\host ode_modules\socket.io\lib\transports\http.js:29:13) at XHRPolling.HTTPPolling (D: odeJS\host ode_modules\socket.io\lib\transports\http-polling.js:27:17) |
我用这种方式实例化路由器:
1 2 3 4 | var app = require('http').createServer(handler) , io = require('socket.io').listen(app, { log: false }) , fs = require('fs'); app.listen(8070); |
然后我正在侦听插入请求:
1 2 3 4 | io.sockets.on('connection', function (socket) { socket.on('createTake', function(data){...} }); |
我在哪里可以应用MaxListeners?
我已经尝试过了:
1 | io.sockets.on(...).setMaxListeners(0); |
但它不起作用。
您正在将侦听器附加到io.sockets(io.sockets.on(...))。 您应该将setMaxListeners应用于同一个对象(到EventEmmiter)。 所以尝试:
1 | io.sockets.setMaxListeners(0); |
这由"maxListeners"选项调节。 您有两种方法:完全禁用内存泄漏(我不建议这样做)或增加maxListeners。
1.要保持功能活跃,请不要过于激进:
默认值为10,增加此值而不是保持内存泄漏检测活动,但不是那么激进。 输入您需要的任何数字。 如果您实际上不知道您将使用多少听众,我会从小步骤开始。 错误的是你得到了那个时候你附加了多少听众。
1 | io.sockets.setMaxListeners(15); |
2.完全禁用内存泄漏功能:
1 | io.sockets.setMaxListeners(0); |
其他相关提示:
获取当前值:
1 | io.sockets.getMaxListeners(); |
如果您只需要对事件使用io.sockets.once(...)做一次反应,它将删除未使用的侦听器。tomekK