确保对象可以被垃圾收集

时间:2014-12-22 06:08:29

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

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

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

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

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

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

所以有四个问题:

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

1 个答案:

答案 0 :(得分:2)

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

但你必须记住这些要点(来自this回答):

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

  2. 使用var关键字。在没有var关键字的情况下创建的任何变量都是在global范围内创建的,并且永远不会有资格进行垃圾回收,从而导致内存泄漏。

  3. 对于全局变量,全局变量永远不会被GC处理,因为全局变量将始终存在。将其设置为null将允许收集它引用的内存。对象使用的内存将有资格进行收集。但该变量仍然存在,它仅引用null(更多here