编程语言
首页 > 编程语言> > Javascript-Spidermonkey上的垃圾收集器问题JS_AnchorPtr()?

Javascript-Spidermonkey上的垃圾收集器问题JS_AnchorPtr()?

作者:互联网

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

现在JS输入了本地根目录并离开了本地根目录,而1.8.5 api中的功能已经消失/无用了,仅在函数调用结束时使用锚指针(JS_AnchorPtr(varname))来确保编译器是“足够”就足够了.删除引用以使垃圾收集器开心吗?

我一直在通过删除对JS_EnterLocalRootScope(see here)的所有引用进行测试
/保留本地根范围,并在脚本底部添加JS_AnchorPtr().

我在蜘蛛猴的源代码中查找了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实现!这个想法是,只要执行使用变量的共享对象符号的调用以使其保持活动状态,调用函数就必须在机器状态下保持该值不变,以执行不执行操作.与js :: Anchor相比,这对perf更具吸引力.

在不太可能的情况下,有一个潜在的陷阱是您与SpiderMonkey进行静态链接并启用了链接时间优化:跨对象调用可以内联为null的实现,从而消除了变量的活跃性,在这种情况下,相同的GC危害可能弹出备份.

标签:javascript,garbage-collection,spidermonkey
来源: https://codeday.me/bug/20191011/1889573.html