事件发射器导致内存泄漏

时间:2016-01-19 10:16:27

标签: node.js memory-leaks eventemitter

我已经看到,如果我在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
       });
   });
});

即使我删除了所有的监听器,我仍然会收到此内存泄漏错误,这意味着该应用程序可能会遇到数百个客户端的麻烦。 如果我按每秒1次按F5,那么"断开连接"出现。但如果我继续按F5,我会看到"断开连接"消息几秒后。就像有一个延迟。 最后,我使用express.js

出了什么问题?

提前致谢

2 个答案:

答案 0 :(得分: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)允许无限数量的事件侦听器。

答案 1 :(得分:0)

您还可以使用setMaxListeners提高事件发射器的默认限制(10),例如:

database.setMaxListeners(100);