2

当我使用 node-imap 模块时,我想到了这个问题。(见https://github.com/mscdex/node-imap

在这个模块中, fetch() 方法将调用一个回调函数,该函数为它提供一个 ImapFetch() 对象,您的代码应该在该对象上侦听“消息”事件。消息事件依次为每个对象传递一个消息对象,其中包含您需要侦听的事件。

这是模块中的示例代码:

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();
  }
);

如图所示,监听器永远不会被移除。如果进程在运行一次后立即退出,这可能会很好。但是,如果进程长时间运行,代码会重复执行,会不会导致内存泄漏?即,由于监听器永远不会被移除,它们保留所有的 fetch 和 message 对象,即使它们只在命令期间使用。

我的理解不正确吗?

4

1 回答 1

1

所发生的情况是,只要您还留在记忆中,您的每个听众都将留在记忆msg中。如果msg寿命比您预期的长,这可能会导致内存泄漏,例如仍然从某个地方引用。但是,如果没有更多的引用,msg那么它将从内存中删除,如果他们也没有更多的引用,侦听器将跟随。

您似乎认为侦听器会保留事件发射器,但事实恰恰相反。

您提供的示例很可能不会导致内存泄漏,因为它看起来像是msg由 node-imap 完成后处理的。

于 2013-07-11T11:49:35.880 回答