蜘蛛猴和垃圾收集

2024-05-22

我正在将 Spidermonkey 嵌入到我的 C++ 应用程序中。我需要在本机 C++ 中实现一些传递 jsval 的自定义 Javascript 函数。我需要防止 jsval 被意外垃圾收集。我这样做是否合适:

(1) 在初始化例程中:

static jsval vp; // a STATIC variable, value unknown
JSBool init((JSContext *cx, uintN argc, jsval *vp) {
   JS_AddValueRoot(cx,  &vp);
}

(2) 在一个实现 Javascript 函数 setter() 的 C++ 函数中:

JSBool setter(JSContext *cx, uintN argc, jsval *vp) {
   ...
  vp=...;// set to some JSObject and hopefully makes any previous JSObject available for gc

}

(3) 在同一编译单元内的第二个 C++ 函数调用中实现 Javascript 函数 getter():

JSBool getter(JSContext *cx, uintN argc, jsval *vp) {
  jsval somethingelse = vp; //directly retrieve the static value stored by setter()
  ....
}

我的 Javascript 脚本使用如下函数调用:

init();
setter(...);
some_other_function_call_that_causes_gc();
getter();
setter(...);
some_other_function_call_that_causes_gc();
getter();
....
some_other_function_call_that_causes_gc();
setter(...);
some_other_function_call_that_causes_gc();
getter();

请注意,我从未调用 JS_RemoveRoot() ,因为静态 jsval 副总裁是我在两个函数调用之间传递的 jsval 的永久存储。而且,我不断在 setter() 中将新值设置到 gc 根静态变量 vp 中,假设存储在 jsval 中的任何先前的 JSObject 将可用于垃圾回收。

这些是创建可以跨函数调用传递的 gc root 临时变量的正确方法吗?特别是,我的 setter() 替换以前的 JSObject 的方式是使现有 JSObject 可用于 gc 的正确方法(即没有内存泄漏/崩溃)。

编辑:我认为垃圾收集是一个问题的原因是:

https://developer.mozilla.org/En/SpiderMonkey/JSAPI_User_Guide https://developer.mozilla.org/En/SpiderMonkey/JSAPI_User_Guide

在 JSAPI 概念、Javascript 值部分下:

jsval 本身并不能保护其所指对象免受垃圾的影响 集电极

https://developer.mozilla.org/en/SpiderMonkey_Garbage_Collection_Tips https://developer.mozilla.org/en/SpiderMonkey_Garbage_Collection_Tips

示例 3 表示“边走边扎根" 并展示了如何将 jsval 分配给根。


不需要为 jsval 这样的东西添加根。您只需要在脚本中维护对该值的引用即可。 SpiderMonkey GC 是基于引用计数的,因此只要在当前范围内引用它们,您的 jsval 就不会消失:

var x = 5;

调用NativeFun(x);

函数 foo() { 抛出 true; }

打印(nativeFunRef());

//脚本到这里就结束了。 X 和 FOO 将被垃圾收集,callNativeFun 和 nativeFunRef js 函数签名也会被垃圾收集。

在上面的代码示例中,x 和 foo 都由全局对象引用。

只要脚本中定义了jsval指针内容,它就永远不会到达GC。确保您的二进制代码在其生命周期结束后永远不会使用该值;也就是说,当您在脚本中完成它并对其调用删除或将其值设置为由范围终止的值或代理未定义时。如果您预见到任何这些负面交互,您应该在该 jsval 上设置 GC root。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蜘蛛猴和垃圾收集 的相关文章

随机推荐

  • 使用从变量中选择的列名称逐行索引数据框

    考虑以下数据框 TEST lt structure list Value c NA NA NA NA NA NA NA NA NA NA NA NA Select structure c 2L 1L 3L 2L 2L 1L 1L 2L 1L
  • Pandas:为什么附加到浮点数和整数的数据帧会比充满 NaN 的数据帧慢

    我正在从一个文件中获取数据 该文件通过 Sierra Chart 从盈透证券 5 秒 OHLCVT 柱线接收数据 按照之前帖子中的建议 我不是将每个新行附加到数据帧 而是使用历史文件构建一个数据帧 并向其中附加 5000 个具有正确时间戳的
  • taskkill /f 和 C# Process.Kill 之间有区别吗?

    用户发现使用 System Diagnostics Process Kill 的 C 程序和 Windows 7 命令行程序 taskkill f 之间存在不同的行为 可能该程序通过 taskkill 可以更干净地死亡 在诉诸 Termin
  • Synchronized_pool_resource 实际上是如何工作的?

    我正在研究C 17中的多态内存分配 我修改了一个使用 monotonic buffer resource 进行向量分配的示例 以使用synchronous pool resource 我发现了一种奇怪的行为 具体来说 有很多内存分配 只是为
  • 在学习 Ajax 之前我应该​​先学习 Xml 和 Javascript 吗?

    A 由于 Ajax 是基于 Javascript 和 Xml 的 我应该在学习 Ajax 之前学习 Xml 和 Javascript 吗 B 即使了解 Javascript 和 Xml 不是必须的 如果我了解 Javascript 和 Xm
  • 具有自定义设计的 ASP.NET 复选框

    有没有办法改变asp net复选框的ui样式 我试过这个 cabeceraCheckBoxNormal background url ig res Default images ig checkbox off gif no repeat c
  • 如何解决“指定的包含路径无效”?

    我有一个相当基本的亲子关系设置 最终结果是我希望能够通过 ASP NET MVC WebAPI 以 JSON 形式返回结果表 我正在使用实体框架 5 0 beta 2 我可以用一个简单的例子来演示我遇到的错误 鉴于课程Category an
  • 纯文本形式的 Google+ 关注者

    如何以纯文本形式获取 google plus 关注者 JSON 或 XMLhttps developers google com api latest people get https developers google com api l
  • 如何在Datastax DSE 5.0 Graph中以简洁的方式通过顶点id进行查询?

    在DSE Graph中 顶点的唯一id似乎是community id 我发现这可行 id 很长 v g V has VertexLabel community id id next 这些都不起作用 v g V community id id
  • 从java运行sqlplus脚本的简单方法

    我有包含 sqlplus 特定脚本的 sql 文件 它包括 或 作为语句终止符 执行存储过程的 EXEC 等 我需要从 java jdbc 执行此脚本 而不需要 sqlplus sql ant任务 maven sql插件无法处理不同的终止符
  • 如何将 ASP.NET 5 从 Beta6 升级到 Beta7

    ASP NET 5 vNext 从 Beta 6 升级到 Beta 7 的备忘单是什么 先决条件 从 Beta 6 开始 请参阅之前的注释 https stackoverflow com questions 31745539 how to
  • 使用服务定位器为 PHP Storm 提供更快、更好、更高效的类型提示

    几个月来我一直在寻找一种方法来做到这一点 我是喜欢自动完成的开发人员之一 对于 zend Framework 2 中的每个服务定位器调用 我输入以下提示 没有全局提示文件 var Module Service SuperService su
  • 更改 Maven 项目中的 JDK (Eclipse)

    New Maven项目创建于Eclipse on Windows 使用默认的 JRE 系统库 J2SE 1 5 Maven项目中的默认系统库 https i stack imgur com a50x7 png 该项目是通过以下方式创建的 新
  • 在Python中解析.xsd

    我需要在 Python 中解析文件 xsd 就像解析 XML 一样 我正在使用 libxml2 我必须解析如下所示的 xsd
  • 使用 System.IO.compressing.Gzip 压缩和解压缩非常大的文件

    我的问题可以用以下语句来描述 我希望我的程序能够压缩和解压缩选定的文件 我有非常大的文件 20 GB 可以安全地假设该大小永远无法装入内存 即使压缩后 压缩文件可能仍然无法放入内存 我想使用 System IO Compression Gz
  • Android Wear:在手持设备上启动服务

    我正在构建一个 Wear 应用程序 它将与手持设备上的 WearableListenerService 进行通信 但是 我想确保当应用程序在手表上启动时服务已启动并运行 我最初的想法是发送意图或广播消息来启动服务 但是 我一直无法弄清楚如何
  • 将 url 从 utf-8 编码重新编码为 iso-8859-1 编码

    我有 file 链接 其中包含非英语字符 这些字符以 UTF 8 进行 UrlEncoded 为了使这些链接在浏览器中工作 我必须对它们重新编码 file development H C3 A5ndplukket doc becomes f
  • 黄瓜测试java例子?

    我想尝试使用黄瓜测试的示例应用程序 黄瓜测试可以仅使用 ruby 完成 也可以使用 java 完成 请帮我举一个示例 谢谢 您可以查看我们在我们这里编写的一个简单示例来演示 cucumber jvm https github com gph
  • 使用 pyclutter 进行编程

    我是混乱 和 pyclutter 的新手 我一直在尝试使用 pyclutter 到目前为止我还没有找到任何好的教程 我的意思是没有真正正确解释的内容 我看到了几个示例程序 但是当我尝试使用 pyclutter 时 我没有得到任何好的结果 这
  • 蜘蛛猴和垃圾收集

    我正在将 Spidermonkey 嵌入到我的 C 应用程序中 我需要在本机 C 中实现一些传递 jsval 的自定义 Javascript 函数 我需要防止 jsval 被意外垃圾收集 我这样做是否合适 1 在初始化例程中 static