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

Java SimpleBindings与ScriptEngine.createBindings()之间的区别(Graal和Nashhorn),java,nashorn,graalvm,scriptengine,graaljs,Java,Nashorn,Graalvm,Scriptengine,Graaljs,注意,我同时使用Nashhorn和Graal,因此下面使用的ScriptEngine可能是Nashhorn引擎的一个实例 当我使用引擎调用createBindings时: 它返回一个对象,该对象具有关闭与绑定关联的上下文的close函数: @Override public void close() { if (context != null) { context.close(); } } 在我的应用程序中,我必须确保在每次使用后通过GraalJSBindings

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

当我使用引擎调用
createBindings
时:

它返回一个对象,该对象具有关闭与绑定关联的上下文的
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
对象。我想知道下面的区别是什么,也就是说,我可以简单地用
新的SimpleBindings()
替换
scriptEngine.createBindings()
,避免像上面那样关闭绑定吗?或者使用
scriptEngine.createBindings()是否有一些优势


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

但是,
GraalJSBindings
的性能可能会更好,特别是如果您反复对相同的绑定执行
eval
代码。和
GraalJSBindings
允许在对绑定进行评估时(从不同的线程)对其进行操作

最好的, 基督教徒

// 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);
    }
}
Bindings bindings = graalJSScriptEngine.createBindings();

vs

Bindings bindings = new SimpleBindings();