spidermonkey上的垃圾收集器问题.... JS_AnchorPtr()?

时间:2012-02-20 06:59:34

标签: javascript garbage-collection spidermonkey

我已经推出了自己的javascript服务器端语言,名为bondi。刚刚升级到新的蜘蛛猴。

现在JS进入本地根并且离开本地root函数从1.8.5 api中消失/无用,只需在函数调用结束时使用锚点指针(JS_AnchorPtr(varname))就可以了编译器是否正在删除引用以保持垃圾收集器的满意度?

我通过删除所有对JS_EnterLocalRootScope(see here)的引用来测试它 /保留本地根范围并将JS_AnchorPtr()添加到脚本的底部。

我在蜘蛛猴的源代码中查找了AnchorPoint函数。猜猜是什么......它什么也没做。它也没有doco。我正在使用它,以便我可以提及这些变量,以便垃圾收集器不会杀死它们。

1 个答案:

答案 0 :(得分:2)

好吧,责备似乎是bug 519949建议你使用js :: Anchor,这样保守的堆栈扫描程序就会把它拿起来。

请注意,保守扫描程序可以找到堆栈或寄存器中的任何GC事物,因此唯一真正棘手的情况是当“拥有”GC事物可能已经死亡时使用派生值,如下所示:

{
    JSString *str = GetMeSomeStringYo();
    const jschar *chars = str->chars();
    // Note, |str| is not "live" here, but the derived |chars| is!
    // The conservative stack scanner won't see |chars| and know
    // to keep |str| alive, so we should be anchoring |str|.
    DoSomethingThatCanCauseGC();
    return chars[0];
}

如果你正在使用C,那么函数末尾的JS_AnchorPtr就足够了。你是正确的,该函数有一个nop实现!这个想法是,只要它正在执行对共享对象符号的调用,并使变量保持活动作为参数,调用函数将具有以将该值保持在机器状态以便执行无操作调用。对于perf而言,这比js :: Anchor更为糟糕。

在不太可能的情况下,有一个潜在的陷阱是您静态链接到SpiderMonkey并启用了链接时间优化:跨对象调用可以使用null实现内联,从而消除变量的活跃性,在这种情况下相同GC危害可能会重新出现。