循环对象上的垃圾回收

Garbage Collection on circular objects?

本文关键字:对象 循环      更新时间:2023-09-26

在我的ws node.js服务器中,我有它,以便当客户端连接时,它会将"user"对象分配给他们的websocket对象,并且在该用户对象内部是对其websocket对象的引用。这允许我在只知道客户端的用户对象时将数据发送到客户端(所有游戏逻辑仅处理用户对象,而不处理 websocket),并且当数据来自其 websocket 对象时,它允许我获取客户端的用户信息。

我听说循环对象可能会导致垃圾回收永远不会清理它们的问题,因为它们相互引用,所以我的问题是,我需要做什么来确保当客户端断开连接时,它们的 websocket 和用户对象都从内存中正确删除?

另外,如果我以完全错误的方式处理这件事,请告诉我! :P


编辑: 代码:

function onConnect(client) {
    users.push({connected: true, client: client, name: "", messages: 0});
    client.user = users[users.length - 1];
    send("Please enter a username.", [client.user]);
}

您必须手动从列表中删除已关闭的连接。否则,垃圾回收器不会从内存中删除它们。

function onConnect(client) {
  users.push({
    connected: true,
    client: client,
    name: "",
    messages: 0
  });
  client.user = users[users.length - 1];
  client.on('close', function(){
    //remove closed connection from the list then let garbage collector does its job.
    users.splice(users.indexOf(client.user), 1);
  });
  send("Please enter a username.", [client.user]);
}