Moj*_*bye 8 memory-leaks node.js socket.io
我使用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);
});
});
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么 ?!
编辑
启动文件后14小时 forever

300个开放套接字与我的nodejs进程相关的大约500MB内存使用量.
编辑
16小时后,300个连接插座
过程停止后.

编辑
请抓住我的新代码.
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];
});
});
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用1000个连接用户(另一个服务器是模拟用户请求和打开套接字)
启动前的内存使用率:100MB,5分钟后和1000个稳定的开放连接:400MB
Yur*_*bin 10
V8在释放未使用的内存时很懒,所以当它实际上只是V8没有运行其垃圾收集器时,它可能看起来像是内存泄漏.要查看是否是这种情况,请使用--expose-gc标志设置运行您的流程,例如
node --expose-gc yourscript.js
Run Code Online (Sandbox Code Playgroud)
并且间隔强制手动垃圾收集(我使用30秒间隔).
setInterval(function(){
global.gc();
console.log('GC done')
}, 1000*30);
Run Code Online (Sandbox Code Playgroud)
代码看起来不错。您提出的内存泄漏几乎肯定不在您共享的代码部分中。
这与您的主要问题无关,但如果您只想列出已连接套接字的数量,则应该使用整数计数器而不是调用Object.keys()对象sockets,如下所示:
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 );
});
});
Run Code Online (Sandbox Code Playgroud)