我使用nodejs和socket.io为一个简单的套接字应用程序编写了下面的代码(只需连接和断开),因为大约50个用户的内存使用量不会发生太大变化,但对300个用户来说,一个小时后内存使用量就会增长( server.js进程的内存使用量接近300‘t,并且随着时间的推移而增长),看起来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小时后

与nodejs进程相关的300个打开套接字和大约500 my的内存使用量。
编辑
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];
});
});我正在对1000个连接的用户进行尝试(另一个服务器是模拟用户请求和打开套接字)
启动前的内存使用量:100 and,5分钟后的和1000个稳定的打开连接:400 and
发布于 2015-06-11 16:40:27
V8在释放未使用的内存时很懒,所以当它实际上只是V8没有运行其垃圾收集器时,它可能看起来像是内存泄漏。要查看是否是这种情况,请使用设置了--expose-gc标志的进程运行。
node --expose-gc yourscript.js和强制手动垃圾收集的间隔(我使用30秒间隔)。
setInterval(function(){
global.gc();
console.log('GC done')
}, 1000*30);发布于 2020-07-29 07:28:31
我和socket.io也有过类似的问题
所以我要解决的是:
io.on('connection', function (socket) {
socket.on('disconnect', function (data) {
destroy();
});
var alive = Date.now();
socket.on('am_alive', (data) => {
alive = Date.now();
}); // client tell the server that it is alive
const intv = setInterval(() => {
if (Date.now() > alive + 20000) {
//sever checks if clients has no activity in last 20s
destroy();
clearInterval(intv);
}
}, 10000);
function destroy() {
try {
socket.disconnect();
socket.removeAllListeners();
socket = null; //this will kill all event listeners working with socket
//set some other stuffs to NULL
} catch {}
}
});如果您想知道为什么我要检查服务器是手动断开的,而不是依赖socket.on('disconnect')。原因是,Socket.io客户端必须通知服务器,在断开连接之前,它将断开它自己的连接。但是,如果客户端的互联网崩溃或者Socket.io客户端运行在浏览器外部的某个平台上,比如JAVA、Dart等等,除非您编写应用程序手动通知服务器断开连接,否则Socket.io_Server永远不会发现它的客户端断开连接。不足为奇的是,socket.state也将返回您的“连接”。
因此,要克服这个问题,服务器必须手动查找其客户端。
发布于 2015-06-10 23:02:48
密码看上去没问题。您建议的内存泄漏几乎肯定不在您共享的代码中。
这与您的主要问题无关,但是如果您只想列出连接的套接字的数量,则应该使用整数计数器,而不是在sockets对象上调用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 );
});
});https://stackoverflow.com/questions/30766753
复制相似问题