2016-01-19 28 views
0

我已經看到了,如果我15秒期間按F5我得到了內存泄漏問題:事件發射器造成內存泄露

(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次,則顯示「斷開」。但是如果我一直按F5,幾秒鐘後我會看到「斷開連接」信息。就像有一個延遲。 最後,我正在使用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建立的每個連接進行了註冊,但是在套接字斷開連接時刪除了此事件偵聽器。所以,這似乎是有效的。

因爲您爲每個連接註冊了一個新的事件偵聽器,所以只要有超過10個socket.io連接,警告消息就會由node.js發出。在這種情況下,擁有超過10個事件監聽器是完全有效的。因此,您應該增加警告消息的限制或允許使用players.setMaxListeners(0)的事件偵聽器的數量無限。