什么时候收集Rhino范围的垃圾?

时间:2014-06-10 23:15:58

标签: java javascript memory-leaks garbage-collection rhino

我正在使用Rhino将JavaScript嵌入到Java类中。我想使用父全局范围创建多个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算法清理掉,或者我是否有机会通过上下文泄漏内存?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

  1. 什么时候发生垃圾收集?
  2. 收集什么?
  3. 您不能也不应该尝试预测何时会发生垃圾收集 - 您应该假设它可能随时发生。这可能是显而易见的,但我注意到它只是为了完整。

    您可以预测可能收集的内容:任何未引用的内容。因此,如果Java中有对范围对象的引用,则不会对其进行垃圾回收。如果parentScope保留对它们的引用,只要引用了parentScope,它们就会存在,但是我没有办法从parentScope到达子作用域。你可以remove references to an object by assigning null or leaving the block where it was declared

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

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