posible fuga de memoria EventEmitter detectada


Estoy recibiendo la siguiente advertencia:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace: 
    at EventEmitter.<anonymous> (events.js:139:15)
    at EventEmitter.<anonymous> (node.js:385:29)
    at Server.<anonymous> (server.js:20:17)
    at Server.emit (events.js:70:17)
    at HTTPParser.onIncoming (http.js:1514:12)
    at HTTPParser.onHeadersComplete (http.js:102:31)
    at Socket.ondata (http.js:1410:22)
    at TCP.onread (net.js:354:27)

Escribí código como este en el servidor.js:

http.createServer(
    function (req, res) { ... }).listen(3013);

¿Cómo arreglar esto ?

Author: Whymarrh, 2012-03-19

15 answers

Esto se explica en el manual: http://nodejs.org/docs/latest/api/events.html#events_emitter_setmaxlisteners_n

¿Qué versión de Nodo es esta? ¿Qué otro código tienes? Ese no es un comportamiento normal.

En resumen, su: process.setMaxListeners(0);

Véase También: nodo.js-solicitud-Cómo " emisor.setMaxListeners ()"?

 72
Author: Corey Richardson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:59

Me gustaría señalar aquí que esa advertencia está ahí por una razón y hay una buena probabilidad de que la solución correcta sea no aumentar el límite, sino averiguar por qué estás agregando tantos oyentes al mismo evento. Solo aumenta el límite si sabes por qué se agregan tantos oyentes y estás seguro de que es lo que realmente quieres.

Encontré esta página porque recibí esta advertencia y en mi caso había un error en algún código que estaba usando que estaba convirtiendo el objeto global en un EventEmitter! Desde luego, desaconsejaría aumentar el límite globalmente porque no quieres que estas cosas pasen desapercibidas.

 121
Author: voltrevo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-16 00:18:18

Por defecto, un máximo de 10 oyentes pueden ser registrados para cualquier evento.

Si es su código, puede especificar maxListeners a través de:

const emitter = new EventEmitter()
emitter.setMaxListeners(100)
// or 0 to turn off the limit
emitter.setMaxListeners(0)

Pero si no es tu código puedes usar el truco para aumentar el límite predeterminado globalmente:

require('events').EventEmitter.prototype._maxListeners = 100;

Por supuesto, puede desactivar los límites, pero tenga cuidado:

// turn off limits by default (BE CAREFUL)
require('events').EventEmitter.prototype._maxListeners = 0;

POR cierto. El código debe estar al principio de la aplicación.

ADD: Desde el nodo 0.11 este código también funciona para cambiar el límite predeterminado:

require('events').EventEmitter.defaultMaxListeners = 0
 62
Author: zag2art,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-25 08:21:31

La respuesta aceptada proporciona la semántica sobre cómo aumentar el límite, pero como @voltrevo señaló que la advertencia está ahí por una razón y su código probablemente tiene un error.

Considere el siguiente código de error:

//Assume Logger is a module that emits errors
var Logger = require('./Logger.js');

for (var i = 0; i < 11; i++) {
    //BUG: This will cause the warning
    //As the event listener is added in a loop
    Logger.on('error', function (err) {
        console.log('error writing log: ' + err)
    });

    Logger.writeLog('Hello');
}

Ahora observa la forma correcta de agregar el oyente:

//Good: event listener is not in a loop
Logger.on('error', function (err) {
    console.log('error writing log: ' + err)
});

for (var i = 0; i < 11; i++) {
    Logger.writeLog('Hello');
}

Busque problemas similares en su código antes de cambiar los maxListeners (que se explica en otras respuestas)

 30
Author: RLaaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-23 18:32:59

Reemplace .on () con once (). usar once () elimina los oyentes de eventos cuando el evento es manejado por la misma función. fuente: http://nodeguide.com/beginner.html#using-eventemitters

Si esto no lo arregla, vuelva a instalar restler con esto en su paquete.json "restler": "git://github.com/danwrong/restler.git#9d455ff14c57ddbe263dbbcd0289d76413bfe07d"

Esto tiene que ver con el mal comportamiento de restler 0.10 con node. puedes ver el problema cerrado en git aquí: https://github.com/danwrong/restler/issues/112 sin embargo, npm todavía tiene que actualizar esto, por lo que es por eso que tiene que hacer referencia a la cabeza git.

Feliz descanso:)

 13
Author: Davis Dulin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-17 00:46:19

También recibo esta advertencia cuando instalo aglio en mi mac osx.

Uso cmd fix it.

sudo npm install -g npm@next

Https://github.com/npm/npm/issues/13806

 3
Author: Legolas Bloom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-28 01:46:02

En mi caso, era child.stderr.pipe(process.stderr) el que estaba siendo llamado cuando estaba iniciando 10 (más o menos) instancias del niño. Así que cualquier cosa, que conduce a adjuntar un controlador de eventos al mismo objeto EventEmitter en un BUCLE, hace que nodejs lance este error.

 1
Author: Vikas Gautam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-22 02:28:29

A veces estas advertencias ocurren cuando no es algo que hemos hecho, sino algo que hemos olvidado hacer!

Me encontré con esta advertencia cuando instalé el paquete dotenv con npm, pero se interrumpió antes de agregar el require('dotenv').instrucción load () al principio de mi aplicación. Cuando regresé al proyecto, comencé a recibir las advertencias de "Posible fuga de memoria EventEmitter detectada".

Asumí que el problema era por algo que había hecho, no por algo ¡No lo había hecho!

Una vez que descubrí mi supervisión y agregué la instrucción require, la advertencia de fuga de memoria se borró.

 1
Author: Motate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-21 18:59:10

Estaba teniendo esto hasta hoy cuando empiezo grunt watch. Finalmente resuelto por

watch:{
        options:{
            maxListeners: 99,
            livereload: true
        },
}

El mensaje molesto se ha ido.

 1
Author: Ariful Haque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-11 06:51:25

Usted dijo que está usando process.on('uncaughtException', callback);
¿Dónde está ejecutando esta declaración? ¿Está dentro de la devolución de llamada pasada a http.createServer?
Si es así, se adjuntará una copia diferente de la misma devolución de llamada al evento uncaughtException en cada nueva solicitud, porque el function (req, res) { ... } se ejecuta cada vez que entra una nueva solicitud y también lo hará la instrucción process.on('uncaughtException', callback);
Tenga en cuenta que el objeto de proceso es global para todas sus solicitudes y agregar oyentes a su evento cada vez que llegue una nueva solicitud no tiene sentido. Puede que no quieras ese tipo de comportamiento.
En caso de que desee adjuntar un nuevo oyente para cada nueva solicitud, debe eliminar todos los oyentes anteriores adjuntos al evento, ya que ya no serían necesarios utilizando:
process.removeAllListeners('uncaughtException');

 0
Author: Monish Chhadwa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-06 13:41:16

La solución de nuestro equipo para esto fue eliminar una ruta de registro de nuestro.npmrc. Teníamos dos alias de ruta en el archivo rc, y uno apuntaba a una instancia de Artifactory que había sido obsoleta.

El error no tenía nada que ver con el código real de nuestra Aplicación, sino todo que ver con nuestro entorno de desarrollo.

 0
Author: RossO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-20 23:40:24

Yo estaba teniendo el mismo problema. y el problema fue causado porque estaba escuchando el puerto 8080, en 2 oyentes.

setMaxListeners() funciona bien, pero no lo recomiendo.

La forma correcta es, comprobar su código para los oyentes adicionales, eliminar el oyente o cambiar el número de puerto en el que está escuchando, esto solucionó mi problema.

 0
Author: Noman Abid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-24 12:35:06

Actualicé de la antigua versión de LTS, 6 algo, a la nueva versión de LTS 8.9.4 y mis errores desaparecieron.

 0
Author: maxpaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 07:27:43

Prefiero buscar y solucionar problemas en lugar de suprimir registros siempre que sea posible. Después de un par de días de observar este problema en mi aplicación, me di cuenta de que estaba configurando oyentes en el req.socket en un middleware Express para atrapar errores de e / s de socket que seguían apareciendo. En algún momento, aprendí que eso no era necesario, pero mantuve a los oyentes alrededor de todos modos. Simplemente los eliminé y el error que estás experimentando desapareció. Verifiqué que era la causa ejecutando solicitudes a mi servidor con y sin el siguiente middleware:

socketEventsHandler(req, res, next) {
        req.socket.on("error", function(err) {
            console.error('------REQ ERROR')
            console.error(err.stack)
        });
        res.socket.on("error", function(err) {
            console.error('------RES ERROR')
            console.error(err.stack)
        });
        next();
    }

La eliminación de ese middleware detuvo la advertencia que está viendo. Me gustaría mirar alrededor de su código y tratar de encontrar en cualquier lugar que pueda estar configurando oyentes que no necesita.

 0
Author: lwdthe1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-12 13:47:05

Ponga esto en la primera línea de su servidor.js (o lo que contenga tu nodo principal.js app):

require('events').EventEmitter.prototype._maxListeners = 0;

Y el error desaparece:)

 -1
Author: Sebastian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-10 13:02:19