3

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

现在 JS 进入本地根并离开本地根函数从 1.8.5 api 中消失/无用,仅JS_AnchorPtr(varname)在函数调用结束时使用锚指针()以确保编译器不会删除对让垃圾收集器开心吗?

我一直在通过删除我对 JS_EnterLocalRootScope 的所有引用(参见此处)/离开本地根范围并添加JS_AnchorPtr()到脚本底部来测试它。

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

4

1 回答 1

2

好吧,责备似乎是说错误 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 危险弹回来。

于 2012-02-26T11:19:42.023 回答