请注意,我同时使用了Nashhorn和Graal,因此下面使用的ScriptEngine
可能是GraalJSScriptEngine或nashhorn引擎的实例。
当我使用GraalJSScriptEngine引擎致电createBindings
时:
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();