SimpleBindings与ScriptEngine.createBindings()之间的区别(Graal和Nash



注意,我同时使用Nashhorn和Graal,因此下面使用的ScriptEngine可能是GraalJScriptEngine或Nashhorn引擎的实例。

当我使用GraalJScriptEngine引擎调用createBindings时:

Bindings bindings = scriptEngine.createBindings();

它返回一个GraalJSBindings对象,该对象具有一个close函数,该函数关闭与绑定相关联的上下文:

@Override
public void close() {
if (context != null) {
context.close();
}
}

在我的应用程序中,我必须确保在每次使用后通过GraalJSBindings.close()关闭此上下文,这是为了防止上下文没有得到GC’ed的内存泄漏。例如:

// Create bindings
Bindings bindings = scriptEngine.createBindings();
// Do stuff
...
// Close bindings if they implement AutoClosable
// I also use the Nashhorn engine, so its possible that bindings
// may not be an instance of AutoCloseable/GraalJSBindings
if (bindings instanceof AutoCloseable) {
try {
((AutoCloseable) bindings ).close();
} catch (final RuntimeException re) {
throw re;
} catch (final Exception ex) {
LOGGER.error("Unable to close script bindings and associated context", ex);
}
}

我注意到还有另一种创建绑定的方法,不是通过引擎,而是通过显式实例化SimpleBindings对象。我想知道下面的区别是什么,也就是说,我可以简单地用new SimpleBindings()替换scriptEngine.createBindings(),避免像上面那样关闭绑定吗?或者使用scriptEngine.createBindings()有什么好处吗?

Bindings bindings = graalJSScriptEngine.createBindings();
vs
Bindings bindings = new SimpleBindings();

内部,SimpleBindings封装在GraalJSBindings对象中。因此,实际上,行为应该是相同的。

不过,GraalJSBindings的性能可能会更好,尤其是如果您为相同的绑定重复eval代码。GraalJSBindings允许在对绑定进行评估时(从不同的线程(对绑定进行操作。

最佳,基督教

最新更新