我要求基于每个用户划分知识库。所有会话都需要在内存中。在第一阶段,我已经测试了2000会话,占用了近750mb的堆内存,考虑到每个会话中有5个规则。有人可以告诉我如何确定每个会话的大小并减少内存消耗,因为我需要将应用程序扩展到10000个用户
答案 0 :(得分:1)
您只需要使用不同数量的并发会话运行您的应用程序,绘制会话与堆大小的图表并进行推断。我没有特别想到与Drools有关的特殊酱汁。
关键是每个会话中的事实数量和规则中的联接数量。您应该阅读“交叉产品”手册的这一部分,该部分解释了如何减少连接:
http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/#d0e941
另外,您应该考虑两个问题:
除非您在每个用户会话开始时插入大量事实,或者您的应用程序正在使用Fusion进行某种流式事件处理,否则您应该能够切换到无状态会话而不会对性能产生任何严重影响。
答案 1 :(得分:0)
它不显示内存使用情况,但这可以帮助您了解当前运行时的所有规则和事实。
了解规则:
ksession2.getKnowledgeBase().getKnowledgePackages().each {
it.rules.each { log.debug "- rules are:"+it.name }
}
事实:
for (Object fact : ksession2.getObjects()) {
sb2z.append (" Fact: " + fact.class.name);
}
我使用上面的脚本方式获取运行时对象信息,并使用一些JVM可视化工具来了解它们的大小。