2013-04-28 56 views
2

當我使用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(); 
    } 
); 

如圖所示,聽衆永遠不會除去。如果進程在運行一次後立即退出,這可能沒有問題。但是,如果進程長時間運行,代碼會重複執行,會導致內存泄漏嗎?即因爲偵聽器不會被刪除,所以它們保留所有的提取和消息對象,即使它們只用於命令的持續時間。

我的理解不正確?

回答

1

發生什麼事是,只要msg保留在內存中,您的每個偵聽器都將保留在內存中。這可能會導致內存泄漏,如果msg比您想要的壽命更長,例如仍然從某處引用。但是,如果沒有更多引用msg,那麼它將從內存中移除,並且如果聽衆沒有更多引用,它們將跟隨。

你似乎認爲聽衆會將事件發射器保持在周圍,但它是相反的。

您給出的示例很可能不會導致內存泄漏,因爲它看起來像msg在完成後由node-imap處理。

+0

你說得對。我錯誤地認爲事件監聽器可能會增加對msg的額外引用,但實際上,這並未發生。 – wciu 2013-07-11 20:30:05

相關問題