垃圾收集关闭规则与Javascript

时间:2011-03-27 18:41:30

标签: javascript garbage-collection

我有一个程序,它使用Javascript作为绑定到更大的C ++应用程序的脚本语言。我可以互换地使用V8和webkit,但底层运行时对于这个问题并不重要。

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

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

显然这会产生GC问题,因为obj超出范围并最终会被删除。

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

一种想法是通过添加obj.myself = obj来自我引用。这似乎是错误的方法,但它可能会起作用,除非垃圾收集算法很聪明。

有没有正确的方法呢?没有构建用于存储对象的基础持久性DOM,所有JS对象都根据需要动态分配,但需要一些方法在JS引擎中保留。

1 个答案:

答案 0 :(得分:7)

自我引用保证任何东西都活着。事实上,没有自我尊重的GC'd语言(我知道)只使用refcounting。甚至不要想到滥用GC算法或任何其他实现定义的细节 - 这种方式就是疯狂。

至于替代方案:创建一些始终可到达的(例如全局)对象,该对象包含所有这些对象(从而使它们保持活动状态)并提供删除对象的方法。然后祈祷没有其他人得到参考 - 甚至更好,不要担心这一点。 GC的重点在于你不应该(必须)知道/关心何时释放内存。

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