2016-01-19 3 views
0

Я видел, что, если нажать F5 во время 15 секунд У меня проблема утечки памяти:События эмиттера вызывает утечку памяти

(node) warning: possible EventEmitter memory leak detected. 11 change listeners added. Use emitter.setMaxListeners() to increase limit. 

Можно ли избежать этого? Я использую Socket.io на стороне сервера, и я задал несколько слушателей на связи:

database.on("ready",function(){ 

    //define all the routes 

    io.on("connection", function(socket){ 
     players.on("change", function change(player) { 
      socket.emit("/player", player); 
     }); 

     //other listeners 


     //I tried : 
     socket.on("disconnect",function(){ 
      console.log("Disconnected"); 
      players.removeAllListeners("change"); 
      //same thing for other listeners 
     }); 
    }); 
}); 

Даже если удалить все слушатели, я все еще получаю эту ошибку утечки памяти, что означает, что приложение может иметь проблемы с сотни клиентов. Если я нажимаю F5 как 1 раз в секунду, появляется сообщение «Disconnected». Но если я продолжаю нажимать F5, через несколько секунд я вижу сообщение «Disconnected». Как и задержка. И, наконец, я использую express.js

Что случилось?

Заранее спасибо

ответ

3

В сообщении (node) warning: possible EventEmitter memory leak detected. 11 change listeners added. Use emitter.setMaxListeners() to increase limit. только предупреждение, что вы можете столкнуться с какой-то утечка памяти. Гипотеза, лежащая в основе этого предупреждения, заключается в том, что регистрация безграничных прослушивателей событий для эмиттера событий и отсутствие удаления прослушивателей событий в конце приведет к утечке памяти. Node.js пытается правильно догадаться, что является допустимым числом прослушивателей событий (по умолчанию: 10) и выдает предупреждение в случае, если определено, что прослушиватели событий по умолчанию определены.

Ваш код представляется для меня разумным, так как прослушиватели событий database.on("ready") и io.on("connection") зарегистрированы только один раз. Единственный возможный незарегистрированный регистратор событий - players.on("change"), потому что этот прослушиватель событий зарегистрирован для каждого соединения, установленного через socket.io, но этот прослушиватель событий удаляется при отключении сокета. Итак, это кажется правильным.

Предупреждающее сообщение будет выдаваться узлом.js всякий раз, когда у вас более 10 соединений socket.io, поскольку вы регистрируете новый прослушиватель событий для каждого соединения. В этом сценарии, который имеет более 10 прослушивателей событий, является абсолютно допустимым. Таким образом, вы должны увеличить лимит для предупреждения или разрешить бесконечное количество прослушивателей событий, используя players.setMaxListeners(0).