【问题标题】:Ensuring object can be garbage collected确保对象可以被垃圾回收
【发布时间】:2015-02-20 05:40:16
【问题描述】:

我的节点/javascript 程序收到大量消息。 每次收到消息时,我都会创建一个新对象,并将消息内容传递给它。 在新对象构造函数中,对象做了很多事情,包括一些带有回调的 mongo 操作。

当在对象构造函数中执行的操作完成时,不再需要或不需要该对象。

经过一些涉及复杂性的实验(即将对象存储在数组元素中或作为“主”对象的属性然后删除它,我尝试了简单的方法。

var x = new DisposableObject(message);
delete x;

这似乎工作正常。任何时候都可能存在许多 DisposableObject 实例。 DisposableObject 被创建并在测试中完成所有预期的事情。 我假设当我删除“x”时,这不会影响对象本身,只会影响“x”中包含的对它的引用。对象回调发生,一切都很好。

那么四个问题:

  1. 这种简单的机制是否允许垃圾收集器 (node/V8) 摆脱对象?
  2. 是否有一些可怕的活板门在等待我的代码,因为我正在这样做?
  3. 当我的程序中没有对它们的活动引用时,浮动的多个 DisposableObject 实例等待回调是否存在任何问题?
  4. 有没有更好的方法来创建对象,然后确保它们在所有操作完成后可以被垃圾回收?

【问题讨论】:

  • 删除 x;不做你描述的事情,除非 x 是全局的,即使那样它也不能完全按照你的想法做......
  • 回调中的私有变量或任何函数将在函数完成时被清理,如果没有其他需要其中的数据。
  • 所以我认为你是说我不需要做任何事情来让对象成为 gc 的。它实际上是在回调中创建的

标签: javascript node.js garbage-collection javascript-objects


【解决方案1】:

Javascript 使用非分代标记和清除垃圾收集器,在 javascript 中的对象在不再需要时会自动进行垃圾收集,因此您无需担心垃圾收集。

但您必须牢记这些要点(来自this 答案):

  1. 您尝试使用delete 并不会真正删除对象,delete 仅对对象的properties 有效。它对variable 或函数名称没有影响。每当您使用new 语句创建对象时,请使用delete 语句,并将其与delete 语句配对。这可确保与对象关联的所有内存(包括其属性名称)都可用于垃圾回收。删除语句在“释放对象”中有更多讨论。

  2. 使用var 关键字。没有使用var 关键字创建的任何变量都是在global 范围内创建的,并且永远不符合垃圾回收条件,从而存在内存泄漏的机会。

  3. 在全局变量的情况下,全局变量永远不会被 GC 丢弃,因为全局变量将始终存在。将其设置为null 将允许收集它引用的内存。对象使用的内存将有资格被收集。但是该变量仍然存在,它只是引用null(更多here

【讨论】:

  • @DaveNewton .. 我已经添加了同一个问题的链接
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多