Java Drool实现使用有状态会话耗尽内存

Java Drool实现使用有状态会话耗尽内存,java,drools,kie,Java,Drools,Kie,我正在尝试恢复一个我没有编写的实现Drool引擎的项目。几乎没有文档可供使用,我个人也从未在我以前的任何项目中使用过Drools。我仍然在做关于Kie/Drools的研究,希望有人能给我一个快捷的解决方法 该项目包含200-300条规则,这些规则实现各种条件构造。我认为问题不在于规则(尽管我可能错了,因为有很多规则使用正则表达式),而在于StatefulKnowledgeSession实现 我认为值得注意的是: drool引擎框架在无法产生任何结果之前会运行几分钟 在它不能产生任何结果之前,它

我正在尝试恢复一个我没有编写的实现Drool引擎的项目。几乎没有文档可供使用,我个人也从未在我以前的任何项目中使用过Drools。我仍然在做关于Kie/Drools的研究,希望有人能给我一个快捷的解决方法

该项目包含200-300条规则,这些规则实现各种条件构造。我认为问题不在于规则(尽管我可能错了,因为有很多规则使用正则表达式),而在于
StatefulKnowledgeSession
实现

我认为值得注意的是:

  • drool引擎框架在无法产生任何结果之前会运行几分钟
  • 在它不能产生任何结果之前,它开始显著减速
  • 此应用程序与之交互的流被视为“大数据”
  • 还有一个线程每1000秒轮询一次结果(我更喜欢设置一个侦听器,而不是轮询结果)
  • 应用程序在不同的线程上创建多个会话
我在JVM上运行了一个探查器,它很快就准确地揭示了我的堆的填充位置:

方法探查器: 对象探查器:


我可以尝试提供尽可能多的代码,尽管对于这个规则框架来说,我还不知道从哪里开始。

为什么它必须是有状态的?我认为规则引擎应该是幂等的。有状态无法缩放。@duffymo我仍在努力解决这个问题。有些规则依赖于其他规则生成结果,这需要有状态会话。但我认为导致问题发生的原因并不多,我是从用户的角度考虑的,而不是从规则引擎的角度考虑的。Rete前向/后向归纳应该允许您迭代规则集,以获得收敛的解决方案。一旦聚合,在发送响应后应清理内存。也许您需要分析您的解决方案以查看内存消耗的位置。@duffymo除非我不理解您的陈述,否则第二个图像是内存分析器。我只能就这个项目进行讨论,这对你和其他阅读我的问题的人来说都很难理解这个项目的基本问题。不,我道歉。你理解得很好。我误读了你的帖子,以为它是堆栈跟踪,而不是内存配置文件。我的错误。