gpt4 book ai didi

java - ScriptEngine 清除和处置

转载 作者:搜寻专家 更新时间:2023-10-31 08:32:29 26 4
gpt4 key购买 nike

我的应用程序使用 ScriptEngine 为我的最终用户提供插件功能。

ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine engine = engineManager.getEngineByName("nashorn");

每当用户更改他的脚本时,应用程序就会用一个新实例替换引擎实例。

String newScript = ...;
engine = engineManager.getEngineByName("nashorn");
engine.eval(newScript);

两个密切相关的问题:

  • 我应该尝试重用引擎并对它们执行某种clear()吗?

  • 如果我只是用一个新实例替换我的引擎,我是否应该以某种方式处理以前的实例,以避免内存泄漏? (例如,我可以想象用户可以设法创建一个启动线程的脚本。)

问题是,我找不到任何看起来像 clear()dispose() 的方法。这是否意味着我目前的做法是正确的?

最佳答案

您可以使用单个引擎实例,但使用单独的 Bindings 对象。 Bindings 充当顶级程序环境,因此如果您想将脚本评估为基本上是“新的全局范围”,那么您可以这样做。查看 javax.script API docs关于如何做到这一点。您可以使用将 Bindings 作为第二个参数的 ScriptEngine.eval 或将 ScriptContext 作为第二个参数的ScriptEngine.eval

即使没有脚本代码从之前的评估中幸存下来,您也可以节省一些初始化时间,因为脚本引擎已经预定义了各种 JavaScript 数据持有者类和属性映射(“隐藏类”)。

另外:是的,一切都被垃圾收集了。不需要明确的“处理”API。

关于java - ScriptEngine 清除和处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32520413/

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