gpt4 book ai didi

java - 使用 Java 8 在 Drools 6.2 中禁用 JIT

转载 作者:行者123 更新时间:2023-11-29 04:57:55 27 4
gpt4 key购买 nike

我们正在使用 Drools 6.2.0.Final 版来解析我们的一些规则。但有时当我们运行很多次时,Drools 会调用导致失败的 JIT 编译器。我们的 Junit 测试中涵盖了这一点,我们收到以下错误

java.lang.NoSuchMethodError: org.mvel2.compiler.BlankLiteral.<init>(Ljava/lang/String;)V
at ConditionEvaluatoref4dc802b6174038b0307f5e6196e229.evaluate(Unknown Source)
at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:248)
at org.drools.core.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:204)
at org.drools.core.reteoo.AlphaNode.assertObject(AlphaNode.java:141)
at org.drools.core.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:494)
at org.drools.core.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:384)
at org.drools.core.reteoo.ObjectTypeNode.propagateAssert(ObjectTypeNode.java:298)
at org.drools.core.phreak.PropagationEntry$Insert.execute(PropagationEntry.java:93)
at org.drools.core.phreak.SynchronizedPropagationList.flush(SynchronizedPropagationList.java:96)
at org.drools.core.phreak.SynchronizedPropagationList.flush(SynchronizedPropagationList.java:69)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.flushPropagations(StatefulKnowledgeSessionImpl.java:1993)
at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1289)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1294)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1281)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1260)
at org.drools.core.impl.StatelessKnowledgeSessionImpl.execute(StatelessKnowledgeSessionImpl.java:306)

我们在 Java 7 中也遇到了这个错误,但是通过使用选项逃脱了这个错误

KieBaseConfiguration kbConfig = KieServices.Factory.get().newKieBaseConfiguration();
kbConfig.setOption(PermGenThresholdOption.get(0));

设置此选项禁用 JIT,我们的代码运行良好。但是由于 Java 8 已经完全删除了 PermGen 选项,我无法找出一个选项来实现同样的事情。这会导致规则在执行大量运行时失败。

我尝试了很多选项来禁用它,但无法使其工作。

- OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE);
- System.setProperty("-Ddrools.dialect.java.compiler", "JANINO");
- System.setProperty("-Djava.compiler", "NONE");
- System.setProperty("-Dmvel2.disable.jit", "true");
- kbConfig.setOption(RuleEngineOption.PHREAK);

一些帮助会很有帮助。

最佳答案

经过大量调试后,我们发现我们的规则之一导致了问题。但是这条规则是有效的,我们不能丢弃它。

最后我找到了一种禁用 JIT 编译器的方法,它解决了我们的问题并且错误消失了。这与 Esteban Aliverti 提到的解决方案不同。下面提到的方法适用于我们的案例,并且适用于大多数案例。

我使用了以下方法来禁用 JIT 编译器:

KieBaseConfiguration kbConfig = KieServices.Factory.get().newKieBaseConfiguration();
kbConfig.setOption(ConstraintJittingThresholdOption.get(-1));

实际解释如下:

0 -> force immediate synchronous jitting (it's adviced to use this only for testing purposes).
-1 (or any other negative number) -> disable jitting
Default value is 20.

因此,一旦我们将 ConstraintJittingThresholdOption 设置为 -1,它就会禁用 JIT 编译器。

关于java - 使用 Java 8 在 Drools 6.2 中禁用 JIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33074146/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com