首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的间隔函数会导致Node.js中的内存泄漏?

为什么我的间隔函数会导致Node.js中的内存泄漏?
EN

Stack Overflow用户
提问于 2017-10-20 06:03:41
回答 1查看 1.2K关注 0票数 1

我有一个Node.js服务器正在经历内存泄漏。它使用socket.io向连接的客户端发出消息。我已经设置了一个函数,它每分钟向客户端发送一条消息。其职能是:

代码语言:javascript
运行
复制
var message = "smile";
const doEveryMinute = (socket) => {
    setTimeout(() => {
        setInterval(() => doEveryMinute(socket), 6000);
        socket.emit('smile', message);   
    }, (60 - date.getSeconds()) * 1000);
}

当用户连接时,通过io.on函数调用该函数:

代码语言:javascript
运行
复制
io.on('connection', function (socket){
    doEveryMinute(socket);
});

我不明白为什么这会导致内存泄漏,但它肯定会导致内存泄漏。我可以在htop上看到,内存缓慢但肯定地填满,直到服务器崩溃,显示memory overflow exception消息。

问题:

为什么这段代码会导致内存泄漏?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-20 06:45:33

首先,6000是6秒,而不是60秒。

您从不调用clearInterval,因此您使用setInterval创建的计时器将永久挂起,每6秒调用一次。记住,这是setInterval,而不是setTimeout,所以计时器在第一次启动后不会停止。

这本身并不一定是一个问题,因为一个定时器的内存使用量可以忽略不计。

但是,由计时器调用的函数调用doEveryMinute,这将创建另一个计时器。它将成倍增长,因为每个计时器创建另一个6秒后。

如果您只想每60秒发送一条消息,则不需要递归,只需一个调用emit的定时器

代码语言:javascript
运行
复制
var message = "smile";
const doEveryMinute = (socket) => {
    setTimeout(() => {
        setInterval(() => socket.emit('smile', message), 60000);
    }, (60 - date.getSeconds()) * 1000);
}

请注意,这仍然不是完美的,因为它从不停止计时器,当连接下降时,您需要添加对clearInterval的适当调用。我还对setInterval的可靠性做了一些可疑的假设,直到60年代才开始使用。我想知道你的原始代码是否试图处理计时器的不精确性?这很好,但如果要这样做,则需要坚持使用setTimeout而不是setInterval

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46843178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档