nodejs,socket.io简单的代码内存泄漏

我写了代码bellow使用nodejs和socket.io为一个简单的套接字应用程序(只是连接和断开连接),约50用户内存使用量不会变化太多,但对于多达300用户和一个小时后,内存使用刚刚长大server.js进程接近300MB,并通过时间传递增长),这看起来像nodejs不释放内存。

var server = require('http').createServer(); var io = require('socket.io')(server); var port = 9090; var sockets = {}; server.listen(port, function () { console.log('Server listening at port ', port); //timer and logs are not problem , i tested it before. setInterval(function(){ console.log(Object.keys(sockets).length+' Online Devices At '+Date()); }, 1000 * 60 * 1); }); io.on('connection',function(socket){ sockets[socket.id]={id:socket.id}; console.log('connected '+socket.id + ' count ' + Object.keys(sockets).length); socket.on('disconnect', function (data) { delete sockets[socket.id]; console.log('disconnected '+socket.id+ ' count ' +Object.keys(sockets).length); }); }); 

难道我做错了什么 ?!

编辑

forever启动文件14小时后 在这里输入图像描述

300个打开的套接字与我的nodejs进程相关的大约500MB的内存使用量。

编辑

16小时后,连接300个sockets 在这里输入图像描述 过程停止后。 在这里输入图像描述

编辑

请给我新的代码。

 var server = require('http').createServer(); var io = require('socket.io')(server); var port = 90; var counter = 0; var clients = {} server.listen(port, function () { console.log('Server listening at port ', port); }); io.on("connection",function(socket){ clients[socket.id] = socket; counter++; socket.on('disconnect', function (data) { counter--; delete clients[socket.id]; }); }); 

我正在试图与1000连接的用户(另一台服务器是模拟用户请求和打开套接字)

开始之前的内存使用情况:100MB, 5分钟后,1000次稳定打开连接:400MB

V8在释放未使用的内存方面是懒惰的,所以当它实际上只是V8没有运行它的垃圾收集器时,它可能看起来像是内存泄漏。 要查看是否属于这种情况,请使用--expose-gc标志设置例如

 node --expose-gc yourscript.js 

并强制手动垃圾收集的时间间隔(我用了30秒的时间间隔)。

 setInterval(function(){ global.gc(); console.log('GC done') }, 1000*30); 

代码看起来不错。 你提出的内存泄漏几乎肯定不在你共享的代码中。

这与您的主要问题不相关,但如果您只想列出连接的套接字的数量,则应使用整数计数器而不是在sockets对象上调用Object.keys() ,如下所示:

 var express = require('express'); var app = express(); var server = require('http').createServer(app); var io = require('socket.io')(server); var port = 9090; var connectedSockets = 0; var sockets = {}; server.listen(port, function () { console.log('Server listening at port ', port); //timer and logs are not problem , i tested it before. setInterval(function(){ console.log(connectedSockets + ' Online Devices At ' + Date()); }, 1000 * 60 * 1); }); io.on('connection',function(socket){ if (!sockets[socket.id]) connectedSockets++; sockets[socket.id]={ id: socket.id }; console.log('connected ' + socket.id + ' count ' + connectedSockets); socket.on('disconnect', function (data) { delete sockets[socket.id]; connectedSockets--; console.log('disconnected ' + socket.id + ' count ' + connectedSockets ); }); });