gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 15:01:34 26 4
gpt4 key购买 nike

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

现在 JS enter local roots and leave local roots 功能从 1.8.5 api 中消失/无用,是否仅在末尾使用 anchor 指针 (JS_AnchorPtr(varname)) 就足够了您的函数调用是为了确保编译器不会删除引用以使垃圾收集器满意吗?

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

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

最佳答案

嗯,怪好像说的是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 进行静态链接并启用链接时间优化,则可能会陷入一个陷阱:跨对象调用可能会内联一个空实现,从而消除变量的活跃性,在这种情况下相同GC 危险可能会再次出现。

关于javascript - spidermonkey 上的垃圾收集器问题.... JS_AnchorPtr()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9357320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com