javascript - 我的 'new Object' 会在套接字断开连接时被垃圾收集吗

标签 javascript node.js socket.io garbage-collection

我有一个代码设置,我想知道它是否被垃圾收集,这样我的系统就不会开始交换和卡住/崩溃。

假设您保持在系统的正常参数范围内,该设置应该能够运行不确定的时间(例如,不要同时将 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/

相关文章:

node.js - 如何使用 sinon stub 异步数据库调用

node.js - Socket.io 的 AS3 库

node.js - 将 jwt 暴露给客户端可能会导致安全问题

javascript - 以串行方式发布多个 Ajax

javascript - 在 HTML 中引用父目录

angularjs - 错误: npm not installing packages

node.js - 使用redis发送好友状态

javascript - 将参数传递给 JavaScript 方法

javascript - 使用 jQuery 将点击事件添加到类中

javascript - 将字符串注入(inject)到从 Node.JS 应用程序中的服务器端环境变量在客户端执行的 Javascript 文件中?