由drools Knowkedge会话采取的记忆

时间:2014-01-23 18:30:33

标签: session memory-management drools

我要求基于每个用户划分知识库。所有会话都需要在内存中。在第一阶段,我已经测试了2000会话,占用了近750mb的堆内存,考虑到每个会话中有5个规则。有人可以告诉我如何确定每个会话的大小并减少内存消耗,因为我需要将应用程序扩展到10000个用户

2 个答案:

答案 0 :(得分:1)

您只需要使用不同数量的并发会话运行您的应用程序,绘制会话与堆大小的图表并进行推断。我没有特别想到与Drools有关的特殊酱汁。

关键是每个会话中的事实数量和规则中的联接数量。您应该阅读“交叉产品”手册的这一部分,该部分解释了如何减少连接:

http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/#d0e941

另外,您应该考虑两个问题:

  1. 有没有办法可以重构使用无状态会话?
  2. 您是否可以通过单一会话来满足所有用户的需求?
  3. 除非您在每个用户会话开始时插入大量事实,或者您的应用程序正在使用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可视化工具来了解它们的大小。