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