首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导致内存泄漏的事件发射器

导致内存泄漏的事件发射器
EN

Stack Overflow用户
提问于 2016-01-19 18:16:27
回答 2查看 1.7K关注 0票数 0

我已经看到,如果我在15秒内按下F5,我就会遇到内存泄漏问题:

代码语言:javascript
复制
(node) warning: possible EventEmitter memory leak detected. 11 change listeners added. Use emitter.setMaxListeners() to increase limit.

有没有可能避免这种情况?我使用的是socket.io服务器端,我在连接上设置了一些监听器:

代码语言:javascript
复制
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

出什么事了?

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2016-01-19 18:38:49

消息(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)的事件侦听器的数量不限。

票数 3
EN

Stack Overflow用户

发布于 2018-07-30 08:52:26

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

代码语言:javascript
复制
database.setMaxListeners(100);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34874079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档