Обратите внимание: я использую и Нашхорн, и Грааль, поэтому возможно, что ScriptEngine
, используемый ниже, является экземпляром GraalJSScriptEngine или движок nashhorn.
Когда я вызываю 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();