【问题标题】:Garbage collector issues on spidermonkey.... JS_AnchorPtr()?spidermonkey 上的垃圾收集器问题.... JS_AnchorPtr()?
【发布时间】:2012-03-10 13:39:00
【问题描述】:

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

既然 JS 进入本地根并离开本地根函数从 1.8.5 api 中消失/无用,在函数调用结束时使用锚指针 (JS_AnchorPtr(varname)) 是否足以确保编译器删除引用不是为了让垃圾收集器满意吗?

我一直在通过删除我对 JS_EnterLocalRootScope (see here) 的所有引用来测试它 / 离开本地根范围,在脚本底部添加JS_AnchorPtr()

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

【问题讨论】:

  • @cdleary 你对此有什么见解吗?

标签: javascript garbage-collection spidermonkey


【解决方案1】:

嗯,责备似乎是说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 危害可能会再次出现。

【讨论】:

    猜你喜欢
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2011-02-23
    • 2011-06-03
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多