防止Spidermonkey Javascript引擎中的垃圾收集

防止Spidermonkey Javascript引擎中的垃圾收集,javascript,garbage-collection,spidermonkey,Javascript,Garbage Collection,Spidermonkey,根据Spidermonkey的用户指南 。。。jsval本身并不保护其引用对象不受垃圾的影响 收藏家 我对这条语句的理解是,如果我们通过JS_NewStringCopyZ()创建一个JSString,那么返回的值可以在任何时候进行gc'ed。e、 g JSString *str=JS_NewStringCopyZ(cx, "hello world"); JS_GC(cx); //..now my "hello world" JSString is gone 那么,我们如何防止上述str被gc

根据Spidermonkey的用户指南

。。。jsval本身并不保护其引用对象不受垃圾的影响 收藏家

我对这条语句的理解是,如果我们通过JS_NewStringCopyZ()创建一个JSString,那么返回的值可以在任何时候进行gc'ed。e、 g

JSString *str=JS_NewStringCopyZ(cx, "hello world");
JS_GC(cx);
//..now my "hello world" JSString is gone

那么,我们如何防止上述str被gc’ed?我注意到有一个JS_EnterLocalRootScope()函数,我可以在我的JSNative函数开始时调用它。不幸的是,它现在被弃用了。那么什么才是防止gc的正确方法呢?

我认为这是重复的——这里的答案显示了当使用SpiderMonkey作为共享库时,如何锚定指针,使它们在gc中保持活动。如果这还不能回答您的问题,请编辑以澄清。

否,该帖子与一个更深层次的问题有关。无论如何,在发现jsapi.h中关于GC的保守堆栈扫描器如何工作的注释后,我意外地找到了答案。也许,在线JSAPI用户指南已经过时了。它仍然建议人们手动创建JSString/JSVAL的根目录,同时指出JS_EnterLocalRootScope已经过时。你不应该依赖保守的堆栈扫描程序。如果您这样做,引擎切换到移动收集器,您的代码将中断。cdleary是对的,我们正在积极地处理移动收集器--请参阅@JavaMan:您能分享适合您的代码吗?