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

示されているように、リスナーは決して削除されません。プロセスが一度実行された直後に終了する場合は、これで問題ない可能性があります。ただし、プロセスが長時間実行されている場合、コードが繰り返し実行され、メモリ リークが発生しますか? つまり、リスナーは削除されないため、コマンドの実行中にのみ使用されるにもかかわらず、すべてのフェッチ オブジェクトとメッセージ オブジェクトが保持されます。

私の理解は間違っていますか?

4

1 に答える 1

1

何が起こるかというと、メモリに残っている限り、各リスナーがメモリにmsg残ります。msgたとえば、まだどこかから参照されているなど、意図したよりも長く存続すると、メモリリークが発生する可能性があります。ただし、それ以上の参照がない場合はmsgメモリから削除され、リスナーもそれらへの参照がなくなると続きます。

リスナーはイベント エミッターを保持すると考えているようですが、それは逆です。

msgあなたが与えた例は、それが終わった後に node-imap によって破棄されるように見えるので、おそらくメモリリークを引き起こさないでしょう。

于 2013-07-11T11:49:35.880 に答える