首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rete对象在重置后不释放值

Rete对象在重置后不释放值
EN

Stack Overflow用户
提问于 2014-07-24 04:22:56
回答 1查看 160关注 0票数 0

我正在使用Jess和一个FixThreadPool来创建几个Rete引擎,这些引擎可以用来在并行模式下评估系统的性能。每个Rete引擎独立于其他引擎运行,接受一个包含系统设计的Java对象作为输入,并输出另一个包含其性能指标的Java对象。

在评估每个系统之前,我将Rete引擎重置为其原始状态。但是,随着程序运行,内存不断堆积,存储的jess.Value对象越来越多。

这是我用来连接Jess和Java的类:

代码语言:javascript
复制
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);
    }
}

当我调用rete.reset()时,变量中包含的对象是否可能指向jess.Value的内容,因此GC不会收集这些内容?

EN

回答 1

Stack Overflow用户

发布于 2014-07-24 13:11:11

我认为,如果传入构造函数的对象(无论是jess.Value还是普通的POJO)引用一个或多个jess.Value,这是可能的。您的cast2JavaObject和RU.valueToObject都不是递归+内省的。

但是,如果包含jess.Value对象怎么办?它们是Java对象的装饰品,即使它们被展开,堆也会单独堆积裸露的对象,只是速度更慢。

如果你使用store/fetch,除了reset,我还会调用clearStorage。

我建议做一个实验来缩小OOM问题的范围。不是重置,而是重新创建Rete对象。如果问题仍然存在,我敢说问题出在应用程序的其他某个角落或缝隙中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24920242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档