[rules-users] Out of Mem and thousand threads : Disabling JIT ?

Raphael Jolivet raphael.jolivet at gmail.com
Fri Nov 8 09:29:39 EST 2013


Hi,

I am using Drools for some time an I recently increased the number of rules
and their complexity.
I have now about 200 rules, for 700 x 200 facts (rules on a cartesian
product on them).

Since then, the computation of rules explodes with the following exception :
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.$$YJP$$start0(Native Method) [na:1.6.0_30]
 at java.lang.Thread.start0(Thread.java) [na:1.6.0_30]
at java.lang.Thread.start(Thread.java:640) [na:1.6.0_30]
 at
java.util.concurrent.ThreadPoolExecutor.addIfUnderMaximumPoolSize(ThreadPoolExecutor.java:727)
~[na:1.6.0_30]
at
java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:657)
~[na:1.6.0_30]
 at
org.drools.rule.constraint.MvelConstraint.jitEvaluator(MvelConstraint.java:232)
~[org-drools-drools-core-5.5.0.Final.jar:5.5.0.Final]
at
org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:197)
~[org-drools-drools-core-5.5.0.Final.jar:5.5.0.Final]
 at
org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:157)
~[org-drools-drools-core-5.5.0.Final.jar:5.5.0.Final]
at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:137)
~[org-drools-drools-core-5.5.0.Final.jar:5.5.0.Final]
 at
org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:59)
~[org-drools-drools-core-5.5.0.Final.jar:5.5.0.Final]
at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:141)
~[org-drools-drools-core-5.5.0.Final.jar:5.5.0.Final]
 at
org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:59)
~[org-drools-drools-core-5.5.0.Final.jar:5.5.0.Final]
at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:141)
~[org-drools-drools-core-5.5.0.Final.jar:5.5.0.Final]
 at
org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:59)
~[org-drools-drools-core-5.5.0.Final.jar:5.5.0.Final]
at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:141)
~[org-drools-drools-core-5.5.0.Final.jar:5.5.0.Final]
 at
org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:59)
~[org-drools-drools-core-5.5.0.Final.jar:5.5.0.Final]
...

After Googling a bit, I saw that this is due to JIT compilation of my rules.
For some reason, each one seem to create a Thread and ends up with
thousands of them.

First of all, I find a bit risky that the JIT compilation is fired by
some *hardcoded
*threshold :
I was not expecting such a technical tricky optimization to randomly
activate depending of my data.

Anyway, I wanted to disable this JIT thing.
I saw that the disabling is only available since *5.5.0.-final* right ?
I have switched to that version but I can't seem to be able to disable it.

I have tried both :
*-Dmvel2.disable.jit=true* (which would not be a viable solution for
production anyway : We can't rely on some settings of the server to ensure
things work)
And also this :
*OptimizerFactory.setDefaultOptimizer("reflective"); *(found
here<http://mvel.codehaus.org/Disabling+the+JIT+Compiler>
)

Any help would be appreciated.
Brgds,

Raphael
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20131108/9763b523/attachment.html 


More information about the rules-users mailing list