当前位置: 首页 > 面试题库 >

MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个消息列表。使用generator.setMaxListeners()增加限制

钮长恨
2023-03-14
问题内容

我知道这可能标记为重复的解决方案,但是堆栈溢出的解决方案对我来说不起作用。

问题:

(node:5716) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 message lis
teners added. Use emitter.setMaxListeners() to increase limit.

我的代码库很大,有时我会遇到此错误,我不知道为什么会发生

我试过了

试图增加听众的限制,但不幸的是它没有用。

const EventEmitter = require('events');
const emitter = new EventEmitter()
emitter.setMaxListeners(50)

更新:

经过一番浏览后,我运行此命令来跟踪wanrning

node --trace-warnings index.babel.js

原来是我的socket.io代码是我正在使用带redis的socket.io的问题

这是错误

node:14212) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 message li
steners added. Use emitter.setMaxListeners() to increase limit
    at _addListener (events.js:281:19)
    at RedisClient.addListener (events.js:298:10)
    at Namespace.<anonymous> (D:/newProject/services/socket.js:21:17)
    at emitOne (events.js:115:13)
    at Namespace.emit (events.js:210:7)
    at Namespace.emit (D:\newProject\node_modules\socket.io\lib\namespace.js:213:10)
    at D:\newProject\node_modules\socket.io\lib\namespace.js:181:14
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)

这是代码(但是此代码用于更具体的任务,它不会一直执行)

const redis = require('redis');
const config = require('../config')
const sub = redis.createClient(config.REDIS.port, config.REDIS.host);
const pub = redis.createClient(config.REDIS.port, config.REDIS.host);

sub.subscribe('spread');


module.exports = io => {
    io.on('connection',(socket) => {

        let passport  = socket.handshake.session.passport;  /* To find the User Login  */
        if(typeof passport !== "undefined") {


            socket.on('typing:send',(data) => {

                pub.publish('spread',JSON.stringify(data))
            });
            sub.on('message',(ch,msg) => { // this is the Exact line where I am getting this error


                io.emit(`${JSON.parse(msg).commonID}:receive`,{...JSON.parse(msg)})
            })


        }
    });
};

问题答案:

事件发射器的默认限制为10。您可以使用generator.setMaxListeners增加它。我的建议是不要更改它,除非并且直到明确要求为止,因为您没有取消订阅,所以增加了侦听器。现在到您的代码。

const redis = require('redis');

const config = require('../config')

const sub = redis.createClient(config.REDIS.port, config.REDIS.host);

const pub = redis.createClient(config.REDIS.port, config.REDIS.host);



sub.subscribe('spread');





module.exports = io => {

    io.on('connection',(socket) => {

    //COMMENT : This callback will be executed for all the socket connections.

        let passport  = socket.handshake.session.passport;  /* To find the User Login  */

        if(typeof passport !== "undefined") {





            socket.on('typing:send',(data) => {



                pub.publish('spread',JSON.stringify(data))

            });

            // COMMENT : This is where you are subscribing for each and every socket conected to your server

            sub.on('message',(ch,msg) => { // this is the Exact line where I am getting this error





//COMMENT : Where as you are emiting message on socket manager not on socket.

io.emit(`${JSON.parse(msg).commonID}:receive`,{...JSON.parse(msg)})

            })





        }

    });

};

现在,如果我们分析以上代码,则如果您打开与服务器的20个套接字连接,它将订阅20次,这是错误的。现在,如果您的要求是在服务器级别上侦听在redis上发布的消息,然后在io上发出,则您的代码应如下所示

const redis = require('redis');

const config = require('../config')

const sub = redis.createClient(config.REDIS.port, config.REDIS.host);

const pub = redis.createClient(config.REDIS.port, config.REDIS.host);



sub.subscribe('spread');





module.exports = io => {

sub.on('message',(ch,msg) => { // this is the Exact line where I am getting this error





                io.emit(`${JSON.parse(msg).commonID}:receive`,{...JSON.parse(msg)});

        });

    io.on('connection',(socket) => {



        let passport  = socket.handshake.session.passport;  /* To find the User Login  */

        if(typeof passport !== "undefined") {





            socket.on('typing:send',(data) => {



                pub.publish('spread',JSON.stringify(data))

            });







        }

    });

};


 类似资料:
  • 问题内容: 我收到以下警告: 我在server.js中编写了这样的代码: 如何解决呢? 问题答案: 这是在解释节点eventEmitter文档 这是哪个版本的Node?您还有什么其他代码?那不是正常行为。 简而言之,其:

  • 问题内容: 我该如何调试我的应用程序并抛出此错误: 我找不到假定的泄漏对象以通过增加监听器限制 解决方案(来自Fardjad和Jan Salawa) 通过jan salawa的搜索,我发现了一个工作库(longjohn),用于增加详细的堆栈跟踪。在fardjad的回应下,我发现我们必须对 AND 进行原型设计。 通过该解决方案,我可以获得以下新跟踪: 问题答案: 原来这是nodejs核心中的错误,

  • 我一直在研究的一个应用程序显示了大量的堆外内存使用情况。 我已经将应用程序配置为使用4096M的Xms和Xmx。但是,在PID上运行会发现进程占用机器内存的9.6%(64GB机器->6.14G应用程序占用空间)。实例存活的时间越长,这种情况似乎就会无限制地增长。驻留尺寸约为5.9g。使用jvisualvm检查流程,我看到堆的使用量约为1.5GB,并且具有健康的GC模式。我已经拉了堆转储和线程转储,

  • 我们有一个在Solaris 10上运行的java进程,为大约200-300个并发用户提供服务。管理员报告说,随着时间的推移,进程使用的内存显著增加。几天内它就达到2GB,并且从未停止增长。 我们已经转储了堆,并使用Eclipse内存探查器对其进行了分析,但没有看到任何异常。堆的大小非常小。 在添加内存统计日志记录后,我们在应用程序中发现管理员使用的“top”实用程序报告的内存使用量与MemoryM

  • 问题内容: 是否有一些工具可以检测Node.js中的内存泄漏?并告诉我您在测试nodejs应用程序方面的经验。 问题答案: 以下工具对于发现内存泄漏很有用: 节点检查器 还有一个教程可以帮助您在此处查找内存泄漏: https://github.com/felixge/node-memory-leak- tutorial

  • 我在哪里可以找到libc_malloc_debug_leak。还有libc_malloc_debug_qemu。那么对于不同的Android版本(冰淇淋三明治、果冻豆、KitKat)和不同的设备(Galaxy Nexus、Nexus 7、Nexus 10)呢?