我的 Node/javascript 程序收到大量消息。 每次收到消息时,我都会创建一个新对象,并向其传递消息内容。 在新对象构造函数中,对象执行了很多操作,包括一些带有回调的 mongo 操作。
当对象构造函数中执行的操作完成时,不再需要或不需要该对象。
经过一些涉及复杂性的实验(即将对象存储在数组元素中或作为“主”对象的属性然后删除它),我尝试了简单的方法。
var x = new DisposableObject(message);
delete x;
这似乎工作正常。任何时候都可能存在许多 DisposableObject 实例。 DisposableObject 已创建并执行测试中预期的所有操作。 我假设当我删除“x”时,这不会影响对象本身,只会影响“x”中包含的对它的引用。对象回调发生,一切都很好。
四个问题:
- 这种简单的机制是否允许垃圾收集器(node/V8)删除该对象?
- 因为我这样做,是否有一些可怕的陷阱门在等待我的代码?
- 当我的程序中没有留下事件引用时,DisposableObject 的多个实例在等待回调时 float ,是否存在任何问题?
- 是否有更好的方法来创建对象,然后确保在完成所有操作后可以对它们进行垃圾回收?
最佳答案
Javascript 使用非分代标记和清除垃圾收集器,在 javascript 中,当不再需要对象时,对象会自动被垃圾收集,因此您无需担心垃圾收集。
但您必须牢记以下几点(来自 this 答案):
您尝试使用的
delete
并不会真正删除对象,delete
仅对对象的属性
有效。它对变量
或函数名称没有影响。每当使用new
语句创建对象时,请使用delete
语句,并将其与delete配对陈述。这确保了与该对象关联的所有内存(包括其属性名称)都可用于垃圾回收。删除语句将在“释放对象”中详细讨论。使用
var
关键字。任何不使用var
关键字创建的变量都会在global
范围内创建,并且永远不符合垃圾回收条件,从而存在内存泄漏的机会。对于全局变量,全局变量永远不会被 GC 释放,因为全局变量将始终存在。将其设置为
null
将允许收集它引用的内存。对象使用的内存将有资格被收集。但该变量仍然存在,并且它只是引用null
(更多 here )
关于javascript - 确保对象可以被垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27597335/