【问题标题】:Drools - Load Large number of rulesDrools - 加载大量规则
【发布时间】:2013-07-30 08:06:54
【问题描述】:

在我的应用程序中,我将近 10,000 条规则加载到 Drools(Drools 5.5.0.final)。但是应用程序抛出 java.lang.OutOfMemoryError 异常。我的 jvm 参数,

-Xms1024m
-Xmx1024m

谁能帮我解决这个问题。我也使用了 BigMemory (http://terracotta.org/products/bigmemory),但仍然遇到同样的错误。

提前致谢!

【问题讨论】:

  • 你有足够的 PermGen 吗?当 Drools 编译规则时,它会创建相当数量的生成类。
  • Viraj:: 你能说说你拥有的堆大小和 permGen,以容纳 10,000 条规则。我需要那个...

标签: drools


【解决方案1】:

使用 VisualVM 之类的分析器(免费且非常易于运行)查看内存随时间变化的图表,并在内存耗尽之前拍摄堆快照。

尤其是该图可以告诉您一些有趣的事情(通过在您的代码中添加一些 Thread.sleep),这可以为您和我们提供线索:

  • 在开始任何事情之前您消耗了多少内存会流口水(因此只需将数据集放在内存中)
  • 内存中有规则会消耗多少内存(知识库)
  • 一旦您从该基础启动 drools 会话并插入数据集,内存将如何演变。

【讨论】:

  • 感谢您的帮助。我使用 VisualVM 来分析问题。现在问题的一部分是好的。我在插入规则和添加知识包时发现 PermGen 快用完了。我修好了。但是现在我遇到了以下异常“线程中的异常“主”“java.lang.OutOfMemoryError:无法创建新的本机线程”这在插入事实时发生的问题。你知道如何解决这个问题吗?再次感谢帮助。:)
  • 还有一件事,我使用了 Eclipse Juno。似乎 Juno 忽略了 jvm 参数。但是当我使用 Intellij IDEA 时,它通过了指定的 jvm args。
  • AFAIK Drools 不会产生新线程。你确定你的代码没有创建new Threads?
  • 100% 确定。我不是在创建线程。我在 linux 中增加了“最大用户进程”。现在线程问题正常。我正在使用statefulKnowledgeSession.insert(fact) 插入事实。
  • 这没有意义。 Drools 不会创建新线程。 也许您的其他库之一会。
【解决方案2】:

当您每次都重复使用相同的“statefulKnowledgeSession”来触发进程时,可能会发生这种情况。在这种情况下,每个statefulKnowledgeSession.insert(fact) 都会插入新的事实,但不会删除以前的事实。您的情况是否请在触发新的处理之前删除/撤回先前插入的事实:

`ksession.retract(factHandle);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2015-02-03
    相关资源
    最近更新 更多