重新加载Drools 5 - 导致PermGen

时间:2015-02-26 09:14:34

标签: java drools

我遇到动态重新加载规则的问题。当我删除然后向KnowledgeBase添加相同的规则时,我在yourkit中看到,由Java编写的类的数量非常快。它看起来像添加一个规则导致重新创建permgen中的所有规则

首先我要删除我的规则:

existingKb.removeRule(pro.pkg, pro.name);

然后我添加新的版本:

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newReaderResource(new StringReader(rule)), ResourceType.DRL);
existingKb.addKnowledgePackages(kbuilder.getKnowledgePackages());

我在互联网上搜索并找到了可能的原因: http://grepcode.com/file/repo1.maven.org/maven2/org.drools/drools-core/5.6.0.Final/org/drools/rule/JavaDialectRuntimeData.java#JavaDialectRuntimeData.wire%28java.lang.String%2Cjava.lang.Object%29

创建新类实例的方法wire在调用方法时调用每个规则:

kb.addKnowledgePackages
你知道这个问题吗?怎么解决这个?我正在使用java 7和drools 5.6 final。

解决方案

经过几次试验,我设法解决了这个问题。我改变了将现有知识库复制到新版本的方式:

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(existingKb);
KnowledgeBase newKb= KnowledgeBaseFactory.newKnowledgeBase();
kbuilder.add(ResourceFactory.newReaderResource(new StringReader(rule)), ResourceType.DRL);
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
copyKnowledgePackagesIfNotExist(existingKb, newKb);
existingKb= newKb;

 private void copyKnowledgePackagesIfNotExist(KnowledgeBase oldKb, KnowledgeBase newKb) {
        for (KnowledgePackage oldKnowledgePackage : oldKb.getKnowledgePackages()) {
            KnowledgePackage newKnowledgePackage = newKb.getKnowledgePackage(oldKnowledgePackage.getName());
            if (newKnowledgePackage == null) {
                Collection<KnowledgePackage> knowledgePackageCollection = new ArrayList<>();
                knowledgePackageCollection.add(oldKnowledgePackage);
                newKb.addKnowledgePackages(knowledgePackageCollection);
            }
        }
    }

Drools仍然在Permgen中创建新类,但它们是垃圾收集。

0 个答案:

没有答案