gpt4 book ai didi

java - Rhino 范围垃圾何时被收集?

转载 作者:太空宇宙 更新时间:2023-11-04 14:48:04 24 4
gpt4 key购买 nike

我正在使用 Rhino 将 JavaScript 嵌入到 Java 类中。我想使用父全局作用域创建多个可编写脚本的作用域,但我无法确定何时或如何清理作用域(收集垃圾)。我只是想确保范围不会泄漏内存。

我想做的事情的简短示例:

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 中有对作用域对象的引用,它们将不会被垃圾收集。如果父作用域保留对它们的引用,那么只要引用父作用域,它们就会存在,但我看不到从父作用域访问子作用域的方法。您可以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 对象都会遵循其自己语言的类似垃圾收集规则。)

关于java - Rhino 范围垃圾何时被收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24152350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com