我正在使用的图书馆有:
这些属性意味着我的应用程序中的一堆东西不太可能被自动垃圾回收。
如果对象的最后一个引用被垃圾回收,我也想自动注销事件处理程序,从而增加了使用更大的药水的机会图书馆可以收集垃圾。
在PHP中,可以为此目的使用__destruct
方法。 Javascript中可能有类似的机制吗?
广义上讲,这是我的依赖关系图的虚构示例:
Parent
- childA
- childB
Parent
在这种情况下仅具有外部引用,因此如果不再使用Javascript,则可以对该对象进行GC,但是当发生这种情况时,我希望Parent通知childA
和childB
他们可以注销他们的事件处理程序,并进行其他清理。
当然,我可以在父对象上添加release()
或destroy()
方法,但我希望此方法能够在不要求最终用户显式通知父对象的情况下工作。
根据this SO question和this v8 blog,node.js不会进行引用计数,而是进行垃圾收集的完整标记清除样式。
这意味着垃圾收集器从执行帧和global
对象开始,并遍历所有引用,将它们标记为可到达。完成后,它将所有无法访问的内存区域标记为“可用空间”。即使您的库中有大量的循环引用和事件侦听器,如果整个引用块/事件发送器本身都无法访问,则所有这些块都将被标记和清除卡住。
您通常不必担心,因为v8的垃圾收集器相当健壮,但是仍然有必要释放需要时不再需要的引用(或确保较短的引用寿命或其他此类技术)。