well it is interesting that it means 98% of the time it is GC doing the work. Think about that - that means if it is only 90% GC doing the work (ie 90% of CPU time is spent running the garbage collector - and freeing enough memory to keep it happy) than it would not trip this error - but I am sure no one would be happy with an application that runs that way !<div>
<br><br><div class="gmail_quote">On Sun, Mar 14, 2010 at 12:50 PM, Greg Barton <span dir="ltr">&lt;<a href="mailto:greg_barton@yahoo.com">greg_barton@yahoo.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Isn&#39;t that what Geoffrey just said? :)<br>
<br>
Anyone tried different GC approaches with this?  Running with the concurrent collector might be a useful stopgap until the object creation is tamped down.<br>
<br>
--- On Sat, 3/13/10, Michael Neale &lt;<a href="mailto:michael.neale@gmail.com">michael.neale@gmail.com</a>&gt; wrote:<br>
<br>
&gt; From: Michael Neale &lt;<a href="mailto:michael.neale@gmail.com">michael.neale@gmail.com</a>&gt;<br>
&gt; Subject: Re: [rules-dev] memory issue (memory leak?) on trunk (probably due true modify changes)<br>
&gt; To: &quot;Rules Dev List&quot; &lt;<a href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a>&gt;<br>
&gt; Cc: &quot;<a href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a>&quot; &lt;<a href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a>&gt;<br>
&gt; Date: Saturday, March 13, 2010, 5:54 PM<br>
<div><div></div><div class="h5">&gt; Interesting error.<br>
&gt;<br>
&gt; One explanation of it: <a href="http://stackoverflow.com/questions/1393486/what-means-the-error-message-java-lang-outofmemoryerror-gc-overhead-limit-excee" target="_blank">http://stackoverflow.com/questions/1393486/what-means-the-error-message-java-lang-outofmemoryerror-gc-overhead-limit-excee</a><br>

&gt;<br>
&gt; Sent from my phone.<br>
&gt;<br>
&gt; On 13/03/2010, at 8:21 PM, Geoffrey De Smet &lt;<a href="mailto:ge0ffrey.spam@gmail.com">ge0ffrey.spam@gmail.com</a>&gt; <br>
&gt;<br>
&gt; wrote:<br>
&gt;<br>
&gt; &gt; Hi guys,<br>
&gt; &gt;<br>
&gt; &gt; With great improvements usually come instability for a<br>
&gt; while :)<br>
&gt; &gt; Trunk has memory issue, probably a memory leak of a<br>
&gt; small object.<br>
&gt; &gt;<br>
&gt; &gt; I&#39;ve run ExmaminationBenchmarkApp with the program arg<br>
&gt; &quot;short&quot; 3 times<br>
&gt; &gt; with the exact same configuration (it is a 100%<br>
&gt; reproducible run):<br>
&gt; &gt;<br>
&gt; &gt; 1) Before the true modify changes with 512m max<br>
&gt; memory<br>
&gt; &gt; Succeeds (100 steps but even 10000 steps work) with no<br>
&gt; slow down.<br>
&gt; &gt;<br>
&gt; &gt; 2) After true modify changes with 512m max memory<br>
&gt; &gt; Fails after 27 steps, starts slowing down at 24<br>
&gt; steps.<br>
&gt; &gt;<br>
&gt; &gt; 3) After true modify changes with 1024m max memory<br>
&gt; &gt; Fails after 57 steps, starts slowing down at 54<br>
&gt; steps.<br>
&gt; &gt;<br>
&gt; &gt; Both 2) and 3) fail with the exception:<br>
&gt; &gt; Exception in thread &quot;main&quot; java.lang.OutOfMemoryError:<br>
&gt; GC overhead <br>
&gt; &gt; limit<br>
&gt; &gt; exceeded<br>
&gt; &gt;<br>
&gt; &gt; So it&#39;s not a heap space error or a perm space error,<br>
&gt; but a GC <br>
&gt; &gt; overhead<br>
&gt; &gt; limit instead. Literally this means it&#39;s doing more GC<br>
&gt; then running,<br>
&gt; &gt; but 99% of the time this means that the heap is so<br>
&gt; full that the GC <br>
&gt; &gt; has<br>
&gt; &gt; little or no free space to work with.<br>
&gt; &gt; This kind of memory leak happens when the iteration<br>
&gt; make 101 objects <br>
&gt; &gt; but<br>
&gt; &gt; only removes 100 objects and the iteration is run a<br>
&gt; lot (like 10000+ <br>
&gt; &gt; times).<br>
&gt; &gt; You don&#39;t get a heap space error, because before that<br>
&gt; happens,<br>
&gt; &gt; there is point where you have a garbaged collected<br>
&gt; free memory for 10<br>
&gt; &gt; objects and a ungarbaged collected free memory for 100<br>
&gt; objects. At <br>
&gt; &gt; that<br>
&gt; &gt; point the GC is running over 98% of the time, which is<br>
&gt; a VM treshold <br>
&gt; &gt; and<br>
&gt; &gt; the error is thrown,<br>
&gt; &gt; even though 10 iterations later you would get a heap<br>
&gt; space error.<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; Logs:<br>
&gt; &gt;<br>
&gt; &gt; 1)<br>
&gt; &gt; TODO<br>
&gt; &gt;<br>
&gt; &gt; 2)<br>
&gt; &gt; 2010-03-13 09:28:36,973 [main] INFO  Step index<br>
&gt; (21), time spend <br>
&gt; &gt; (37245)<br>
&gt; &gt; taking step (323 {D180|S9} @ 9 {D210} + 5 {C65} =&gt;<br>
&gt; 52 {D210}) out of<br>
&gt; &gt; 1402 accepted moves.<br>
&gt; &gt; 2010-03-13 09:28:38,454 [main] INFO  Step index<br>
&gt; (22), time spend <br>
&gt; &gt; (38727)<br>
&gt; &gt; taking step (367 {D190|S40} @ 28 {D210} + 5 {C65}<br>
&gt; =&gt; 19 {D210}) out of<br>
&gt; &gt; 1366 accepted moves.<br>
&gt; &gt; 2010-03-13 09:28:39,903 [main] INFO  Step index<br>
&gt; (23), time spend <br>
&gt; &gt; (40176)<br>
&gt; &gt; taking step (230 {D120|S15} @ 7 {D210} + 3 {C60} =&gt;<br>
&gt; 12 {D210}) out of<br>
&gt; &gt; 1366 accepted moves.<br>
&gt; &gt; 2010-03-13 09:28:43,901 [main] INFO  Step index<br>
&gt; (24), time spend <br>
&gt; &gt; (44174)<br>
&gt; &gt; taking step (190 {D90|S6} @ 1 {D210} + 3 {C60}<br>
&gt; &lt;=&gt; 205 {D120|S6} @ 8<br>
&gt; &gt; {D210} + 6 {C111}) out of 1392 accepted moves.<br>
&gt; &gt; 2010-03-13 09:28:50,631 [main] INFO  Step index<br>
&gt; (25), time spend <br>
&gt; &gt; (50904)<br>
&gt; &gt; taking step (420 {D180|S6} @ 46 {D210} + 2 {C129}<br>
&gt; =&gt; 25 {D210}) out of<br>
&gt; &gt; 1396 accepted moves.<br>
&gt; &gt; 2010-03-13 09:29:06,184 [main] INFO  Step index<br>
&gt; (26), time spend <br>
&gt; &gt; (66457)<br>
&gt; &gt; taking step (211 {D180|S53} @ 15 {D210} + 0 {C260}<br>
&gt; =&gt; 23 {D210}) out <br>
&gt; &gt; of<br>
&gt; &gt; 1383 accepted moves.<br>
&gt; &gt; 2010-03-13 09:29:46,589 [main] INFO  Step index<br>
&gt; (27), time spend<br>
&gt; &gt; (106862) taking step (39 {D120|S15} @ 50 {D210} + 2<br>
&gt; {C129} =&gt; 43 <br>
&gt; &gt; {D210})<br>
&gt; &gt; out of 1383 accepted moves.<br>
&gt; &gt; Exception in thread &quot;main&quot; java.lang.OutOfMemoryError:<br>
&gt; GC overhead <br>
&gt; &gt; limit<br>
&gt; &gt; exceeded<br>
&gt; &gt;    at<br>
&gt; java.util.HashMap.addEntry(HashMap.java:753)<br>
&gt; &gt;    at<br>
&gt; java.util.HashMap.put(HashMap.java:385)<br>
&gt; &gt;    at<br>
&gt; java.util.HashMap.putAll(HashMap.java:524)<br>
&gt; &gt;    at<br>
&gt; &gt; org.drools.rule.GroupElement$Type.getOuterDeclarations<br>
&gt;<br>
&gt; &gt; (GroupElement.java:406)<br>
&gt; &gt;    at<br>
&gt; org.drools.rule.GroupElement.getOuterDeclarations<br>
&gt; &gt; (GroupElement.java:109)<br>
&gt; &gt;    at<br>
&gt; &gt; org.drools.base.DefaultKnowledgeHelper.getDeclaration<br>
&gt;<br>
&gt; &gt; (DefaultKnowledgeHelper.java:213)<br>
&gt; &gt;    at<br>
&gt; &gt;<br>
&gt; org.drools.planner.examples.examination.solver.Rule_periodSpread_0DefaultConsequenceInvoker.evaluate(<br>
&gt;<br>
&gt; &gt; Rule_periodSpread_0DefaultConsequenceInvoker.java:21)<br>
&gt; &gt;    at<br>
&gt; org.drools.common.DefaultAgenda.fireActivation<br>
&gt; &gt; (DefaultAgenda.java:903)<br>
&gt; &gt;    at<br>
&gt; org.drools.common.DefaultAgenda.fireNextItem<br>
&gt; &gt; (DefaultAgenda.java:850)<br>
&gt; &gt;    at<br>
&gt; org.drools.common.DefaultAgenda.fireAllRules<br>
&gt; &gt; (DefaultAgenda.java:1061)<br>
&gt; &gt;    at<br>
&gt; &gt; org.drools.common.AbstractWorkingMemory.fireAllRules<br>
&gt; &gt; (AbstractWorkingMemory.java:741)<br>
&gt; &gt;    at<br>
&gt; &gt; org.drools.common.AbstractWorkingMemory.fireAllRules<br>
&gt; &gt; (AbstractWorkingMemory.java:707)<br>
&gt; &gt; ...<br>
&gt; &gt;<br>
&gt; &gt; 3)<br>
&gt; &gt; 2010-03-13 09:47:38,303 [main] INFO  Step index<br>
&gt; (55), time spend<br>
&gt; &gt; (114213) taking step (186 {D90|S17} @ 24 {D210} + 5<br>
&gt; {C65} &lt;=&gt; 516<br>
&gt; &gt; {D180|S12} @ 15 {D210} + 0 {C260}) out of 1382<br>
&gt; accepted moves.<br>
&gt; &gt; 2010-03-13 09:48:02,062 [main] INFO  Step index<br>
&gt; (56), time spend<br>
&gt; &gt; (137972) taking step (498 {D120|S17} @ 28 {D210} + 0<br>
&gt; {C260} =&gt; 1 <br>
&gt; &gt; {C100})<br>
&gt; &gt; out of 1389 accepted moves.<br>
&gt; &gt; 2010-03-13 09:48:35,748 [main] INFO  Step index<br>
&gt; (57), time spend<br>
&gt; &gt; (171658) taking step (15 {D135|S96} @ 16 {D210} + 1<br>
&gt; {C100} &lt;=&gt; 164<br>
&gt; &gt; {D180|S48} @ 3 {D210} + 0 {C260}) out of 1378 accepted<br>
&gt; moves.<br>
&gt; &gt; Exception in thread &quot;main&quot; java.lang.OutOfMemoryError:<br>
&gt; GC overhead <br>
&gt; &gt; limit<br>
&gt; &gt; exceeded<br>
&gt; &gt;    at<br>
&gt; java.lang.Integer.valueOf(Integer.java:625)<br>
&gt; &gt;    at<br>
&gt; &gt;<br>
&gt; org.drools.common.TruthMaintenanceSystem.removeLogicalDependencies<br>
&gt;<br>
&gt; &gt; (TruthMaintenanceSystem.java:180)<br>
&gt; &gt;    at<br>
&gt; &gt;<br>
&gt; org.drools.common.AbstractWorkingMemory.removeLogicalDependencies<br>
&gt;<br>
&gt; &gt; (AbstractWorkingMemory.java:1455)<br>
&gt; &gt;    at<br>
&gt; &gt; org.drools.reteoo.RuleTerminalNode.retractLeftTuple<br>
&gt; &gt; (RuleTerminalNode.java:266)<br>
&gt; &gt;    at<br>
&gt; &gt;<br>
&gt; org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateRetractLeftTuple(<br>
&gt;<br>
&gt; &gt; SingleLeftTupleSinkAdapter.java:176)<br>
&gt; &gt;    at<br>
&gt; &gt;<br>
&gt; org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateRetractLeftTuple(<br>
&gt;<br>
&gt; &gt; SingleLeftTupleSinkAdapter.java:57)<br>
&gt; &gt;    at<br>
&gt; &gt; org.drools.reteoo.EvalConditionNode.modifyLeftTuple<br>
&gt; &gt; (EvalConditionNode.java:250)<br>
&gt; &gt;    at<br>
&gt; &gt;<br>
&gt; org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(<br>
&gt;<br>
&gt; &gt; SingleLeftTupleSinkAdapter.java:198)<br>
&gt; &gt;    at<br>
&gt; org.drools.reteoo.JoinNode.modifyLeftTuple(JoinNode.java:304)<br>
&gt; &gt;    at<br>
&gt; &gt;<br>
&gt; org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(<br>
&gt;<br>
&gt; &gt; SingleLeftTupleSinkAdapter.java:209)<br>
&gt; &gt;    at<br>
&gt; org.drools.reteoo.JoinNode.modifyRightTuple(JoinNode.java:221)<br>
&gt; &gt;    at<br>
&gt; org.drools.reteoo.BetaNode.modifyObject(BetaNode.java:317)<br>
&gt; &gt;    at<br>
&gt; &gt;<br>
&gt; org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject<br>
&gt;<br>
&gt; &gt; (CompositeObjectSinkAdapter.java:444)<br>
&gt; &gt;    at<br>
&gt; &gt;<br>
&gt; org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject<br>
&gt;<br>
&gt; &gt; (CompositeObjectSinkAdapter.java:412)<br>
&gt; &gt;    at<br>
&gt; org.drools.reteoo.ObjectTypeNode.modifyObject<br>
&gt; &gt; (ObjectTypeNode.java:262)<br>
&gt; &gt;    at<br>
&gt; org.drools.reteoo.EntryPointNode.modifyObject<br>
&gt; &gt; (EntryPointNode.java:174)<br>
&gt; &gt;    at<br>
&gt; &gt; org.drools.common.AbstractWorkingMemory.update<br>
&gt; &gt; (AbstractWorkingMemory.java:1392)<br>
&gt; &gt;    at<br>
&gt; &gt; org.drools.common.AbstractWorkingMemory.update<br>
&gt; &gt; (AbstractWorkingMemory.java:1288)<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; --<br>
&gt; &gt; With kind regards,<br>
&gt; &gt; Geoffrey De Smet<br>
&gt; &gt;<br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; rules-dev mailing list<br>
&gt; &gt; <a href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a><br>
&gt; &gt; <a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a><br>
&gt; _______________________________________________<br>
&gt; rules-dev mailing list<br>
&gt; <a href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a><br>
&gt;<br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
rules-dev mailing list<br>
<a href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Michael D Neale<br>home: <a href="http://www.michaelneale.net">www.michaelneale.net</a><br>blog: <a href="http://michaelneale.blogspot.com">michaelneale.blogspot.com</a><br>

</div>