Разница между SimpleBindings и ScriptEngine.createBindings () (Graal и Nashhorn)

Обратите внимание: я использую и Нашхорн, и Грааль, поэтому возможно, что 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();

person Rory    schedule 03.11.2020    source источник


Ответы (1)


внутри SimpleBindings заключены в GraalJSBindings объект. Таким образом, поведение должно быть идентичным.

Однако производительность GraalJSBindings может быть лучше, особенно если вы многократно eval кодируете одни и те же привязки. И GraalJSBindings позволяет манипулировать привязками во время их оценки (из другого потока).

Лучший, христианин

person Christian Wirth    schedule 09.11.2020