可以帮我看一下这段websockets代码是哪里导致的内存溢出?
io.sockets.on( "connection", function( socket ){
console.log('socket connect');
let client = modbus.client.tcp.complete({
'host' : '192.168.1.8',
'port' : 10000,
'autoReconnect' : false,
'reconnectTimeout' : 1000,
'timeout' : 5000,
'unitId' : 1
});
client.connect();
client.on('connect', function () {
console.log('modbus');
setInterval(function(){
client.readInputRegisters(1,24).then(function(resp){
let arr=resp.payload;
socket.emit('info',arr);
},console.error);
},1000);
socket.on('switch',function(msg){
console.log(msg.flag+" "+msg.on);
client.writeSingleCoil(msg.flag, msg.on).then(function (resp) {
console.log(resp);
}, console.error);
console.log(msg);
});
socket.on('disconnect',function(socket){
console.log('socket disconnect');
client.close();
delete client;
});
});
client.on('error', function (err) {
console.log(err);
});
client.on('close', function () {
console.log('modbus close');
});
});
2 回复
先声明下,并不了解的io.js里面的socket相关api,从代码本身上看到了下面这个问题
setInterval(function(){
client.readInputRegisters(1,24).then(function(resp){
let arr=resp.payload;
socket.emit('info',arr);
},console.error);
},1000);
通过setInterval
注册的匿名定时器函数持有对client的引用,在匿名函数不可被回收的情况下(setInterval
是全局函数),client本身也是无法被回收的,所以问题来了,请问clearInterval
在哪里?
@AserSayHi 好的,刚接触node还不太了解node的机制。非常感谢你的提示,我这就去改下代码试试。