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



我推出了自己的javascript服务器端语言bondi。最近刚刚升级为新的蜘蛛猴。

既然1.8.5 api中的JS enter local roots and leaf local roots.函数已经不复存在了,那么在函数调用结束时只使用锚点指针(JS_AnchorPtr(varname))来确保编译器不会删除引用来让垃圾收集器满意吗?

我一直在通过删除对JS_EnterLocalRootScope的所有引用来测试它(请参阅此处)/保留本地根作用域并将JS_AnchorPtr()添加到脚本底部。

我在蜘蛛猴的源代码中查找了AnchorPoint函数。你猜怎么着。。。它什么都不做。也没有相关的文档。我使用它只是为了在中提及这些变量,这样垃圾收集器就不会杀死它们。

好吧,指责似乎是说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危害。