在对象被垃圾收集后清理

Clean up after an object gets garbage-collected

我正在开发一个图书馆:

这些属性意味着我的应用程序中的一堆东西不太可能被自动垃圾收集。

如果对象的最后一个引用被垃圾收集,我还想自动取消注册事件处理程序,增加更大药水的机会 图书馆可以收集垃圾。

在 PHP 中,可以使用 __destruct 方法来达到此目的。 Javascript中是否有类似的机制?

从广义上讲,这将是我的依赖关系图的虚构示例:

Parent
  - childA
  - childB

Parent在这种情况下只有外部引用,所以Javascript如果不再使用这个对象可以GC,但是当这种情况发生时,我希望Parent通知两个childAchildB 他们可以取消注册他们的事件处理程序并进行额外的清理。

当然,我可以在父级上添加一个 release()destroy() 方法,但我希望它能够在不需要最终用户明确通知父级的情况下工作。

根据 this SO question and this v8 blog node.js 不进行引用计数,而是使用完整的标记清除式垃圾收集。

这意味着垃圾收集器从执行帧和global对象开始,遍历所有引用,将它们标记为可达。完成后,它将所有无法访问的内存区域标记为 "free space"。即使您的库有大量循环引用和事件侦听器,如果 references/the 事件发射器本身的整个块不可访问,所有这些都将被标记和扫描丢弃。

您通常不必担心,因为 v8 的垃圾收集器相当健壮,但仍然需要注意在需要时释放不再需要的引用(或确保引用或其他类似的生命周期较短)技术)。

If the last reference of an object gets garbage collected, I would like to also automatically de-register event handlers, increasing the chances of larger potions of the library can get garbage collected.

您正在寻找 weak references 及其终结器。事件处理程序不会保留对实例的直接引用,而只会保留一个弱引用。当实例被垃圾回收时,终结器可以注销事件处理程序。

另见 https://v8.dev/features/weak-references。不过,我没有看到任何关于 node.js 支持这一点的声明。