setmaxlisteners possible nodejs node maxlistenersexceededwarning leak emitter detected node.js memory-leaks eventemitter

node.js - nodejs - maxlistenersexceededwarning: possible eventemitter memory leak detected



NodeJS: Cómo depurar "Se detectó una pérdida de memoria del EventEmitter. 11 oyentes añadidos ” (7)

¿Cómo puedo depurar mi aplicación que arroja este error:

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

No pude encontrar el objeto supuestamente filtrado para aumentar el límite de escucha por .setMaxListeners(0);

SOLUCIÓN (de fardjad y jan salawa)

Con las búsquedas de jan salawa, encontré una biblioteca funcional ( longjohn ) para aumentar los trazos de pila de forma detallada. Con la respuesta de fardjad he encontrado que tenemos que prototipo EventEmitter.addListener Y EventEmitter.on .

Con la solución pude conseguir este nuevo rastro:

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


Intenté crear un prototipo del EventEmitter para agregar mensajes de registro en addListener pero no pude hacerlo funcionar

Para enganchar addListener puedes hacer algo como esto:

// 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); }



Esta advertencia se lanzará si se registra para un evento particular de un mismo objeto más de 11 veces.

Verifique si está teniendo un evento ''on'' para un evento particular en una función a la que llama con frecuencia, esto lleva a registrarse para un evento varias veces.

This enlace me ayudó a entender esto.


Esto es exactamente lo que me pasó. Para mí, anidé accidentalmente un detector de eventos dentro de otro detector de eventos.

Mire su código y asegúrese de NO tener un bloque de escucha de eventos DENTRO de otro bloque de escucha de eventos, por ejemplo (a menos que lo haga a propósito):

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

En el ejemplo incorrecto anterior, el oyente socket.on (''cerrar'') debe estar FUERA del bloque socket.on (''data'').

En mi caso, cuando recibí 5 transmisiones de datos, el oyente socket.on (''cerrar'') está esperando que ocurra un evento de cierre. Cuando cierro una vez, se ejecuta otro 4to evento de cierre. Esto claramente no es lo que quería. Esto se debe a la naturaleza de Node.js que no es de bloqueo. ''Recuerda'' eventos debido a la función de devolución de llamada.


Me encontré con el mismo problema al probar los componentes React usando moca y enzima .

Pude resolver mi problema al desmontar explícitamente los componentes después de haber terminado de probarlos.

El problema era que estaba montando componentes varias veces en mis pruebas, que luego agregaban más oyentes, hasta que la cantidad de oyentes llegó a 11, y recibí una advertencia.

Cambié mi código de prueba agregando la línea rendering.unmount () . Esto solucionó el problema para mí.

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


Para mí, parece que tu bucle de eventos está bloqueado. Esto puede suceder si está realizando tareas intensivas de CPU en el bucle de eventos node.js. Puedes usar el proceso hijo para hacer una tarea intensiva.

Puede verificar qué está bloqueando node.js usando los siguientes métodos :

  1. Medir el tiempo de cálculo de cada llamada. Inicie sesión si el tiempo es alto para que sepa que la aplicación se está comportando mal.
  2. Configura un horario de registro para que sepas cuándo algo está bloqueando el bucle.

    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. Usar profile.
  4. Utilice this para el registro y la creación de perfiles. Es la biblioteca utilizada en Nodejitsu .

Resulta que este es un error en el núcleo de nodejs, estamos hablando de este problema aquí: https://github.com/joyent/node/issues/5108

La solución para servidores http con EventEmitter memory leak detected que arroja una EventEmitter memory leak detected y llena la memoria disponible / los tiempos de CPU disponibles:

v0.8.23 versión heredada v0.8.23 . (Puede descargarlo e instalarlo / compilarlo desde aquí: http://blog.nodejs.org/2013/04/08/node-v0-8-23-legacy/ )

ACTUALIZACIÓN 2018: veo varios comentarios sobre este tema, mientras que el problema parece haber desaparecido desde hace años. Tenga en cuenta que esta respuesta es solo para una compilación de servidor http con fugas con nodejs . Si se encuentra en otro escenario, mire las otras respuestas en este hilo y no reduzca la versión (como se sugiere en esta respuesta), perderá su tiempo.