我正在使用 Jess 和 FixThreadPool 来创建多个 Rete 引擎,这些引擎可用于在并行模式下评估系统的性能。每个 Rete 引擎都独立于其他引擎运行,并将一个包含系统设计的 Java 对象作为输入,并输出另一个包含其性能指标的 Java 对象。
在评估每个系统之前,我将 Rete 引擎重置为其原始状态。但是,随着我的程序运行,RAM 内存不断堆积,存储了越来越多的 jess.Value 对象。
这是我用来连接 Jess 和 Java 的类:
public class Variant {
private final Object value;
private final String type;
public Variant(Object value) {
this.value = cast2JavaObject(value);
this.type = (this.value instanceof List) ? "multislot" : "slot";
}
public Object getValue() {
return value;
}
public String getType() {
return type;
}
private Object cast2JavaObject(Object value) {
try {
if (value instanceof Value) {
return castJessValue((Value) value);
} else {
return value;
}
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
return null;
}
}
private synchronized Object castJessValue(Value value) throws Exception {
if (value.type() == RU.LIST) {
List list = new ArrayList<Object>();
list.addAll(Arrays.asList((Object[]) RU.valueToObject(Object.class, value, null)));
return list;
} else {
return RU.valueToObject(Object.class, value, null);
}
}
public Value toJessValue() throws Exception {
Object val;
if (value instanceof List) {
val = ((List) value).toArray();
} else {
val = value;
}
return RU.objectToValue(val.getClass(), val);
}
}
变量中包含的对象是否有可能指向 jess.Value 的内容,因此当我调用 rete.reset() 时它们没有被 GC 收集?