обнаружена утечка памяти EventEmitter [node.js]


Answers

Я хотел бы отметить здесь, что это предупреждение существует по какой-то причине, и есть хороший шанс, что правильное исправление не увеличивает лимит, но выясняет, почему вы добавляете столько слушателей к одному и тому же событию. Только увеличьте предел, если вы знаете, почему так много слушателей добавляются и уверены, что это то, что вы действительно хотите.

Я нашел эту страницу, потому что получил это предупреждение, и в моем случае была ошибка в некотором коде, который я использовал, который превращал глобальный объект в EventEmitter! Я бы посоветовал не увеличивать лимит во всем мире, потому что вы не хотите, чтобы эти вещи оставались незамеченными.

Question

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

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

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




замените .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.

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




Я также получаю это предупреждение при установке aglio на моем mac osx.

Я использую cmd для исправления.

sudo npm install -g npm@next

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




Иногда эти предупреждения возникают, когда это не то, что мы сделали, а то, что мы забыли сделать!

Я столкнулся с этим предупреждением, когда установил пакет dotenv с номером npm, но был прерван, прежде чем я успел добавить инструкцию require ('dotenv'). Load () в начале моего приложения. Когда я вернулся к проекту, я начал получать предупреждения об обнаружении утечки «Возможная ошибка EventEmitter».

Я предположил, что проблема была в том, что я сделал, а не в том, чего я не сделал!

Как только я обнаружил свой надзор и добавил оператор require, предупреждение об утечке памяти очистилось.




Вы сказали, что используете process.on('uncaughtException', callback);
Где вы выполняете это заявление? Он находится в http.createServer переданном http.createServer ?
Если да, другая копия того же обратного вызова будет привязана к событию uncaughtException при каждом новом запросе, потому что function (req, res) { ... } будет выполняться каждый раз, когда приходит новый запрос, и так будет выполняться инструкция process.on('uncaughtException', callback);
Обратите внимание: объект процесса является глобальным для всех ваших запросов и добавляет слушателей к его событию каждый раз, когда приходит новый запрос, не имеет никакого смысла. Возможно, вы не захотите такого поведения.
Если вы хотите добавить нового слушателя для каждого нового запроса, вы должны удалить все предыдущие прослушиватели, прикрепленные к событию, поскольку они больше не потребуются, используя:
process.removeAllListeners('uncaughtException');




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

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

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