- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我使用 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();
}
);
如图所示,监听器永远不会被删除。如果进程在运行一次后立即退出,这可能没问题。但是,如果进程长时间运行,代码被重复执行,是否会导致内存泄漏? IE。由于监听器永远不会被删除,因此它们会保留所有获取和消息对象,即使它们仅在命令期间使用。
我的理解有误吗?
最佳答案
发生的情况是,只要 msg
保留在内存中,每个监听器都会保留在内存中。如果 msg
的生存时间比您预期的要长,例如仍然从某处引用,这可能会导致内存泄漏。但是,如果没有更多对 msg
的引用,那么它将从内存中删除,并且如果监听器也没有更多对它们的引用,它们也会跟随。
您似乎认为监听器会保留事件发射器,但事实恰恰相反。
您给出的示例很可能不会导致内存泄漏,因为它看起来像 msg
在完成处理后由 node-imap 处理。
关于node.js - 如果不调用removeAllListeners(),EventEmitter会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16268609/
我遇到了与 Improve this AngularJS factory to use with socket.io 类似的问题但接受的答案似乎使用了一个不再存在的函数,所以如果我需要删除监听器,在
我正在使用 socket.io-client在我的 Angular 8 应用程序中。 我正在使用如下所示的服务: private socket: SocketIOClient.Socket; priv
我是一名优秀的程序员,十分优秀!