當我使用node-imap模塊時,這個問題進入我的腦海。 (請參閱https://github.com/mscdex/node-imap)如果removeAllListeners()未被調用,EventEmitter是否會導致內存泄漏?
在此模塊中,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();
}
);
如圖所示,聽衆永遠不會除去。如果進程在運行一次後立即退出,這可能沒有問題。但是,如果進程長時間運行,代碼會重複執行,會導致內存泄漏嗎?即因爲偵聽器不會被刪除,所以它們保留所有的提取和消息對象,即使它們只用於命令的持續時間。
我的理解不正確?
你說得對。我錯誤地認爲事件監聽器可能會增加對msg的額外引用,但實際上,這並未發生。 – wciu 2013-07-11 20:30:05