我推出了自己的 javascript 服务器端语言,称为 bondi。最近刚刚升级到新的蜘蛛猴。
现在JS进入本地根和离开本地根的功能从1.8.5 api中消失/无用了,只使用锚点指针就足够了(JS_AnchorPtr(varname)
)在函数调用结束时确保编译器不会删除引用以使垃圾收集器满意?
我一直在通过删除所有对 JS_EnterLocalRootScope 的引用来测试它(see here)
/ 保留本地根范围并添加JS_AnchorPtr()
到脚本的底部。
我在蜘蛛猴的源代码中查找了 AnchorPoint 函数。你猜怎么着……它什么也没做。也没有 doco。我使用它只是为了可以提及这些变量,这样垃圾收集器就不会杀死它们。
好吧,责备似乎是这么说的错误 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 实现!这个想法是,只要它使用要保持活动状态的变量作为参数来执行对共享对象符号的调用,调用函数就会have将该值保留在机器状态中,以便执行不执行任何操作的调用。对于 perf 来说,这比 js::Anchor 更糟糕。
在不太可能的情况下,您静态链接 SpiderMonkey 并启用链接时间优化,会出现一个潜在的陷阱:跨对象调用可能会内联 null 实现,从而消除变量的活跃性,在这种情况下,可能会出现相同的 GC 危险弹出备份。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)