什么时候回收Rhino作用域的垃圾?



我使用Rhino在Java类中嵌入JavaScript。我想使用父Global作用域创建多个Scriptable作用域,但是我不知道作用域何时或如何被清理(垃圾收集)。我只是想确保作用域没有泄漏内存。

我想做的一个简单的例子:

private Global parentScope;
private Context cx;
public MyClass() {
    cx = ContextFactory.getGlobal().enterContext();
    cx.setOptimizationLevel(-1);
    cx.setLanguageVersion(Context.VERSION_1_5);
    parentScope = new Global(cx);
}
public Scriptable createNewChildScope() {
    Scriptable scope = cx.newObject(parentScope);
    scope.setPrototype(null);
    scope.setParentScope(parentScope);
    return scope;
}

现在,如果我创建了一堆子作用域,它们如何以及何时知道被清理?它们只是pojo,将被使用的任何GC算法清除,还是有可能通过上下文发生内存泄漏?

谢谢!

虽然作用域引用javascript,但对象是Java的,因此它们必须遵循Java垃圾收集规则。我认为这里隐含着两个问题:

  1. 垃圾收集何时发生?
  2. 收集什么?

你不能也不应该试图预测垃圾收集何时发生——你应该假设它可能在任何时候发生。这可能是显而易见的,但我指出它只是为了完整。

你可以预测什么会被收集:任何未被引用的东西。因此,如果Java中有对作用域对象的引用,它们将不会被垃圾收集。如果parentScope保留了对它们的引用,那么只要引用了parentScope,它们就会存在,但是我没有看到从parentScope获取子作用域的方法。你可以通过赋值null或离开声明该对象的块来删除对该对象的引用。

Scriptable scope1 = createNewChildScope();
Scriptable scope2 = createNewChildScope();
// ...
scope1 = createNewChildScope(); // first allocated scope can be garbage collected
// scope2 is still safe

(类似地,只要作用域存在,作用域内的任何javascript对象都将在其自己的语言中遵循类似的垃圾收集规则。)

最新更新