确保对象可以被垃圾回收

Ensuring object can be garbage collected

本文关键字:对象 确保      更新时间:2023-09-26

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

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

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

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

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

所以四个问题:

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

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

但是您必须牢记以下几点(来自此答案(:

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

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

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