我的节点/ javascript程序收到大量消息。 每次收到消息时,我都会创建一个新对象,并将其传递给消息内容。 在新对象构造函数中,该对象执行大量操作,包括一些带回调的mongo操作。
当对象构造函数中执行的操作完成后,不再需要或不需要该对象。
经过一些涉及复杂性的实验(即将对象存储在数组元素中或作为主对象的属性然后将其删除,我尝试了简单的方法。
var x = new DisposableObject(message);
delete x;
这似乎工作正常。任何时候都可能存在许多DisposableObject实例。创建DisposableObject并在测试中完成预期的一切。 我假设当我删除' x'这不会影响对象本身,只是对' x'中包含的对它的引用。对象回调发生,一切都很好。
所以有四个问题:
答案 0 :(得分:2)
Javascript使用非代理标记和清除垃圾收集器,在javascript对象不再需要时会自动进行垃圾收集,因此您无需担心垃圾收集。
但你必须记住这些要点(来自this回答):
您使用delete
尝试的内容并未真正删除对象,delete
仅对对象properties
有效。它对variable
或函数名称没有影响。每当使用delete
语句创建对象时使用new
语句,将其与delete语句配对。这可确保与对象关联的所有内存(包括其属性名称)都可用于垃圾回收。删除语句将在“释放对象”中进行更多讨论。
使用var
关键字。在没有var
关键字的情况下创建的任何变量都是在global
范围内创建的,并且永远不会有资格进行垃圾回收,从而导致内存泄漏。
对于全局变量,全局变量永远不会被GC处理,因为全局变量将始终存在。将其设置为null
将允许收集它引用的内存。对象使用的内存将有资格进行收集。但该变量仍然存在,它仅引用null
(更多here)