我已经看到,如果我在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
出什么事了?
提前感谢
发布于 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)的事件侦听器的数量不限。
发布于 2018-07-30 08:52:26
您还可以使用setMaxListeners提高事件发射器的默认限制(10),例如:
database.setMaxListeners(100);https://stackoverflow.com/questions/34874079
复制相似问题