2

注意,我同时使用 Nashhorn 和 Graal,所以下面使用的可能是GraalJSScriptEngine或 nashhorn 引擎ScriptEngine的实例。

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

Bindings bindings = scriptEngine.createBindings();

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

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

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

// 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对象。我想知道以下有什么区别,即我可以简单地替换scriptEngine.createBindings()new SimpleBindings()并避免像我上面所做的那样关闭绑定吗?或者使用有什么好处scriptEngine.createBindings()

Bindings bindings = graalJSScriptEngine.createBindings();

vs

Bindings bindings = new SimpleBindings();
4

1 回答 1

1

在内部,SimpleBindings被包裹在一个GraalJSBindings对象中。如此有效地,行为应该是相同的。

的性能GraalJSBindings可能会更好,特别是如果您eval为相同的绑定重复编码。并GraalJSBindings允许在评估绑定时(从不同的线程)操作绑定。

最好的,克里斯蒂安

于 2020-11-09T17:46:59.630 回答