如果removeAllListeners()未被调用,EventEmitter会导致内存泄漏吗?

当我使用node-imap模块时,这个问题进入了我的脑海。 (请参阅https://github.com/mscdex/node-imap )

在这个模块中,fetch()方法会调用一个callback函数,给它一个ImapFetch()对象,你的代码假设要侦听一个“消息”事件。 消息事件轮stream将每个对象的消息对象与需要侦听的事件进行传递。

以下是模块中的示例代码:

imap.fetch(results, { headers: ['from', 'to', 'subject', 'date'], cb: function(fetch) { fetch.on('message', function(msg) { console.log('Saw message no. ' + msg.seqno); msg.on('headers', function(hdrs) { console.log('Headers for no. ' + msg.seqno + ': ' + show(hdrs)); }); msg.on('end', function() { console.log('Finished message no. ' + msg.seqno); }); }); } }, function(err) { if (err) throw err; console.log('Done fetching all messages!'); imap.logout(); } ); 

如图所示,听众不会被删除。 如果该进程在运行一次后立即退出,这可能没有问题。 但是,如果进程长时间运行,代码会重复执行,会导致内存泄漏吗? 也就是说,由于侦听器不会被删除,所以即使它们只用于命令的持续时间,它们仍然保留所有的获取和消息对象。

我的理解是不正确的?

发生什么事是,只要msg留在内存中,你的每一个监听器都将保留在内存中。 这可能会导致一个内存泄漏,如果msg寿命超过您的意图,例如仍然从某处引用。 但是,如果没有更多的引用msg那么它将被从内存中删除,如果听众没有更多的引用,听众将会跟随。

你似乎认为听众会把事件发射器放在旁边,但是这是相反的。

你给的例子很可能不会导致内存泄漏,因为看起来好像msg是由node-imap完成的。