javascript - 确保对象可以被垃圾收集

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

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

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

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

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

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

四个问题:

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

最佳答案

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

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

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

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

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

关于javascript - 确保对象可以被垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27597335/

相关文章:

javascript - NodeJS - 如何在自执行函数中将构造函数分配给 module.exports?

node.js - Sequelize 错误的查询?查找参数

javascript - 如何从 Window 中删除 JQuery/让 GC 接受它

javascript - 使用一个导航选项卡实现控制多个选项卡内容

javascript - knockout 选项绑定(bind)不起作用

javascript - 获取 Node js服务器上特定时区的当前时间

algorithm - 混淆浏览器垃圾回收算法

java - 了解 Java 垃圾收集中的足迹测量

Javascript:如何直接从对象生成格式化的易于阅读的 JSON?

javascript - 如何在 Javascript 中创建数组对象