【问题标题】:Javascript object memory management when using delete on property在属性上使用删除时的 Javascript 对象内存管理
【发布时间】:2011-08-10 14:11:57
【问题描述】:

我目前正在编写一个 node.js/socket.io 应用程序,但这个问题对于 javascript 来说很普遍。

我有一个关联数组,用于存储每个客户端连接的颜色。考虑以下几点:

var clientColors = new Array();

//This execute each new connection
socket.on('connection', function(client){   
clientColors[client.sessionId] = "red";

    //This execute each time a client disconnect
    client.on('disconnect', function () {
        delete clientColors[client.sessionId];
    });
});

如果我使用delete语句,我担心它会导致内存泄漏,因为以client.sessionId命名的属性值(关联数组是对象)不会被删除,它对它的值的引用将会消失,但是属性将仍然存在于对象中。

我说的对吗?

【问题讨论】:

  • 这对我来说一切都很好。它将删除 client.sessionId 的 clientColors 条目。

标签: javascript node.js socket.io


【解决方案1】:

delete clientColors[client.sessionId];

这将删除对对象clientColors 上的对象的引用。 v8 垃圾收集器将拾取具有 个引用的任何对象进行垃圾收集。

现在,如果您问这是否会在 IE4 中造成内存泄漏,那就是另一个问题了。而 v8 可以轻松处理这个问题。

看到您删除了唯一的引用,该属性也将消失。另请注意,对象不是 javascript 中的“关联数组”,因为排序是特定于实现的,并且不受 ES 规范的保证。

【讨论】:

    【解决方案2】:

    由于clientColors[client.sessionId]在这种情况下是一个原始值(一个字符串),它会立即被清除。

    让我们考虑更复杂的foo[bar] = o 情况,其中o 是一个非原始对象(某个对象)。重要的是要了解o 不是存储在“内部”foo,而是存储在任意内存位置的某个位置。 foo 仅保存指向该位置的指针。当您调用delete foo[bar] 时,该指针被清除,由垃圾收集器来释放o 占用的内存。

    顺便说一句:当你想要一个关联数组时,你不应该使用Array。后者在 Javascript 中称为Object,通常使用简写的准字面量{}进行实例化

    【讨论】:

      【解决方案3】:

      如果您使用 V8 引擎或 nodejs/io,它可能不会导致泄漏,但始终建议防止泄漏。

      直接删除

      delete clientColors[client.sessionId];
      

      或者设置为null

      clientColors[client.sessionId] = null;
      

      这也将级联到任何原型继承的对象。

      这样几乎没有开始泄漏的可能性。

      【讨论】:

      • 我假设您的意思是在将数组元素分配给 null 之前删除,否则您不会删除任何内容,因为 clientColors[client.sessionId] 引用将为 null。还是我误解了你的意图?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 2010-09-17
      • 1970-01-01
      • 2019-06-22
      相关资源
      最近更新 更多