我有一个Node.js服务器正在经历内存泄漏。它使用socket.io向连接的客户端发出消息。我已经设置了一个函数,它每分钟向客户端发送一条消息。其职能是:
var message = "smile";
const doEveryMinute = (socket) => {
setTimeout(() => {
setInterval(() => doEveryMinute(socket), 6000);
socket.emit('smile', message);
}, (60 - date.getSeconds()) * 1000);
}当用户连接时,通过io.on函数调用该函数:
io.on('connection', function (socket){
doEveryMinute(socket);
});我不明白为什么这会导致内存泄漏,但它肯定会导致内存泄漏。我可以在htop上看到,内存缓慢但肯定地填满,直到服务器崩溃,显示memory overflow exception消息。
问题:
为什么这段代码会导致内存泄漏?
发布于 2017-10-20 06:45:33
首先,6000是6秒,而不是60秒。
您从不调用clearInterval,因此您使用setInterval创建的计时器将永久挂起,每6秒调用一次。记住,这是setInterval,而不是setTimeout,所以计时器在第一次启动后不会停止。
这本身并不一定是一个问题,因为一个定时器的内存使用量可以忽略不计。
但是,由计时器调用的函数调用doEveryMinute,这将创建另一个计时器。它将成倍增长,因为每个计时器创建另一个6秒后。
如果您只想每60秒发送一条消息,则不需要递归,只需一个调用emit的定时器
var message = "smile";
const doEveryMinute = (socket) => {
setTimeout(() => {
setInterval(() => socket.emit('smile', message), 60000);
}, (60 - date.getSeconds()) * 1000);
}请注意,这仍然不是完美的,因为它从不停止计时器,当连接下降时,您需要添加对clearInterval的适当调用。我还对setInterval的可靠性做了一些可疑的假设,直到60年代才开始使用。我想知道你的原始代码是否试图处理计时器的不精确性?这很好,但如果要这样做,则需要坚持使用setTimeout而不是setInterval。
https://stackoverflow.com/questions/46843178
复制相似问题