我有一个代码设置,我想知道它是否被垃圾收集,这样我的系统就不会开始交换和卡住/崩溃。
假设您保持在系统的正常参数范围内,该设置应该能够运行不确定的时间(例如,不要同时将 1.000.000 个用户连接到一个单线程进程)
我做了一个简化版本。
// connection.js
var io, Handler;
io = require('socket.io');
Handler = require('./handler');
io.on('connection', function (socket) {
new Handler({socket: socket})
});
// handler.js
var Handler,
bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
function Handler(arg) {
this.socket = arg.socket;
this.test = bind(this.test, this);
console.log('Handler', 'New connection', this.socket.id);
this.listeners();
}
Handler.prototype.listeners = function() {
return this.socket.on('test', this.test);
};
Handler.prototype.test = function() {
return console.log('SocketIO', 'test', this.socket.id);
};
module.exports = Handler;
所以“新处理程序”在“套接字断开事件”发生后会被垃圾收集吗?
如果不是我应该如何更改代码?
一开始我以为这可以解决问题
var io, connections, Handler;
io = require('socket.io');
Handler = require('./handler');
connections = {}
io.on('connection', function (socket) {
connections[socket.id] = new Handler({socket: socket});
socket.on('disconnect', function (){
connections[socket.id] = null
})
});
但这只会创建对“新处理程序”的引用,并在断开连接时删除相同的引用。这并不一定意味着“新处理程序”也将被删除。它可能仍在监听和/或执行操作。
最佳答案
只要您的 Handler
对象没有其他代码保留对它的引用,就应该进行垃圾收集。
当实际套接字本身关闭时,系统知道事件处理程序不再事件,因此它们不会阻止垃圾收集。当您删除具有事件处理程序的 DOM 对象时,浏览器会执行相同的操作,以便这些事件处理程序不会阻止垃圾收集。
因此,当socket
关闭并且socket.io释放它对Javascript套接字对象的所有引用时,不应该有任何代码对Handler
有任何引用> 不再反对,它将有资格进行垃圾收集。
如果您自己引用 Handler
对象,例如:
var connections = {};
io.on('connection', function (socket) {
connections[socket.id] = new Handler({socket: socket});
});
然后,您必须在断开连接时清除该引用,如下面的代码所示。否则,此引用将保持事件状态,并防止 Handler
对象被垃圾回收。
var connections = {};
io.on('connection', function (socket) {
connections[socket.id] = new Handler({socket: socket});
socket.on('disconnect', function() {
delete connections[socket.id];
})
});
注意:我建议您实际使用 delete
来删除该属性,而不是仅仅将其设置为 null
。这样,您就不会在 connections
对象上构建未使用的属性。
关于javascript - 我的 'new Object' 会在套接字断开连接时被垃圾收集吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36969070/