可以帮我看一下这段websockets代码是哪里导致的内存溢出?
发布于 7 年前 作者 panyunyi 3616 次浏览 来自 问答
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');
	});
});

untitled1.png

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的机制。非常感谢你的提示,我这就去改下代码试试。

回到顶部