使用Javascript进行垃圾回收闭包规则

7

我有一个程序,它使用JavaScript作为脚本语言与一个更大的C++应用程序进行绑定。我会交替使用V8和webkit,但是对于这个问题来说,底层运行时不应该有影响。

在这个应用程序中,我动态创建的对象将接收回调。我将像这样创建此回调绑定...

function f() {
  var obj = CreateNewCallbackObj();
  obj.onCallback = dowork; // dowork is a function
}

很明显,这将会有垃圾回收问题,因为obj已经超出了范围并最终将被删除。

我的想法是让对象自我管理其生命周期。该对象最终将接收到一个回调,该回调将标志着它的生命周期结束,当发生这种情况时,它可以自行删除。

一种想法是通过添加obj.myself=obj来进行自引用。这似乎不是正确的方法,但如果垃圾回收算法很聪明,它可能会起作用。

有没有正确的方法来解决这个问题?没有底层的持久DOM可用于存储对象,所有JS对象都是根据需要动态分配的,但需要某种方式在JS引擎内保留这些对象。

1个回答

7

自我引用并不能保证任何东西的存活。实际上,几乎所有我所知道的使用垃圾回收语言(GC'd language)的自尊心都不会仅使用引用计数(refcounting)算法。不要试图滥用GC算法或其他实现定义的细节 - 这样只会导致疯狂。

至于替代方案:创建一些始终可达的对象(例如全局对象),它保存了所有这些对象(因此使它们保持活动状态),并提供一个删除对象的方法。然后祈祷没有其他人引用了这些对象 - 或者更好的是,不必担心这个问题。 GC 的整个重点在于您不应该(必须)知道/关心内存何时被释放。

您还可以添加一个 alive 属性,在所有方法的开头检查它,并在调用 !this.alive 时引发错误 - 当然这并不能保证,但它可能有助于调试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接