node.js maxlistenersexceededwarning: possible - обнаружена утечка памяти EventEmitter




8 Answers

Это объясняется в руководстве: http://nodejs.org/docs/latest/api/events.html#events_emitter_setmaxlisteners_n

Какая версия узла это? Какой еще код у вас есть? Это не нормальное поведение.

Короче говоря, его: process.setMaxListeners(0);

Также см .: node.js - request - Как «emitter.setMaxListeners ()»?

memory leak

Я получаю следующее предупреждение:

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

Я написал код, подобный этому в server.js:

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

Как это исправить?




По умолчанию для любого события может быть зарегистрировано не более 10 слушателей. Если это ваш код, вы можете указать maxListeners через:

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

Но если это не ваш код, вы можете использовать трюк, чтобы увеличить лимит по умолчанию во всем мире:

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

Конечно, вы можете отключить ограничения, но будьте осторожны:

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

PS. Код должен быть в самом начале вашего приложения.

ADD: Поскольку узел 0.11 также работает для изменения ограничения по умолчанию:

require('events').EventEmitter.defaultMaxListeners = 0



замените .on () на один раз (). using once () удаляет прослушиватели событий, когда событие обрабатывается одной и той же функцией. источник: http://nodeguide.com/beginner.html#using-eventemitters

если это не исправить, то переустановите restler с этим в вашем пакете.json «restler»: «git: //github.com/danwrong/restler.git#9d455ff14c57ddbe263dbbcd0289d76413bfe07d"

это связано с перестановкой 0.10 с ошибкой с узлом. вы можете увидеть, что проблема закрыта на git здесь: https://github.com/danwrong/restler/issues/112 однако npm еще не обновил это, поэтому вы должны обратиться к git head.

счастливый отдых :)




В моем случае это был child.stderr.pipe(process.stderr) который вызывался, когда я child.stderr.pipe(process.stderr) 10 (или около того) экземпляров дочернего элемента. Итак, все, что приводит к подключению обработчика события к одному объекту EventEmitter в LOOP, заставляет nodejs выкидывать эту ошибку.




У меня было это до сегодняшнего дня, когда я начал grunt watch . Наконец,

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

Досадное сообщение исчезло.




Исправление нашей команды для этого - удаление пути реестра из нашего .npmrc. В файле rc у нас было два псевдонима пути, и один указывал на экземпляр Artifactory, который был устаревшим.

Ошибка не имела никакого отношения к фактическому коду нашего приложения, но все, что связано с нашей средой разработки.




Я обновился от старой версии LTS, что-то еще, до новой версии LTS версии 8.9.4, и мои ошибки ушли.




Поместите это в первую строку вашего server.js (или что-то еще, содержащее ваше основное приложение Node.js):

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

и ошибка уходит :)




Related