Java 重新加载Drools 5-导致PermGen

Java 重新加载Drools 5-导致PermGen,java,drools,Java,Drools,我在动态重新加载规则时遇到问题。当我将相同的规则删除并添加到知识库中时,我在yourkit中看到Java提供的类的数量正在快速增加。这看起来像是添加了一条规则(在permgen中重新创建所有规则) 首先,我要删除我的规则: existingKb.removeRule(pro.pkg, pro.name); 然后我添加了新的版本: KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder

我在动态重新加载规则时遇到问题。当我将相同的规则删除并添加到知识库中时,我在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());
我在互联网上搜索并找到了可能的原因:

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

kb.addKnowledgePackages
你知道这个问题吗?如何解决这个问题?我正在使用Java7和Drools5.6

解决方案

经过几次试验,我成功地修复了这个错误。我改变了将现有知识库复制到新知识库的方式:

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);
            }
        }
    }
KnowledgeBuilder kbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder(现有KB);
KnowledgeBase newKb=KnowledgeBaseFactory.newKnowledgeBase();
kbuilder.add(ResourceFactory.newReaderResource(NewStringReader(rule)),ResourceType.DRL);
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
copyKnowledgePackagesIfNotExist(现有KB,新KB);
existingKb=newKb;
私有void copyKnowledgePackagesIfNotExist(知识库旧KB,知识库新KB){
对于(KnowledgePackage oldKnowledgePackage:oldKb.getKnowledgePackages()){
KnowledgePackage newKnowledgePackage=newKb.getKnowledgePackage(oldKnowledgePackage.getName());
if(newKnowledgePackage==null){
Collection knowledgePackageCollection=new ArrayList();
knowledgePackageCollection.add(旧KnowledgePackage);
newKb.addKnowledgePackages(knowledgePackageCollection);
}
}
}

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

这似乎在6.x版本中得到了修复。看起来是这样吗?升级到drools 6是一个巨大的变化。有什么办法可以动态添加规则而不增加permgen吗?我在bug DB中找到了一些条目,这些条目是在6.0之前编写的。我不知道这个问题是否在5.x版本中出现过。你能提供一些指向这些bug的链接吗?