<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>We have found a workaround that eliminates the leftover event (gone from Working Memory, but not from the JVM memory):&nbsp;</div><div><br></div><div>The rule “forget it ever happened” (seen below) causes the problem. &nbsp;Re-writing it to remove the check for RAISE in the LHS eliminated the memory leak. &nbsp;Of course, our application requires the check for RAISE, so it can be accomplished by manually querying working memory from the RHS. &nbsp;It’s ugly, but it resolved the issue.</div><div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span style="color: #a91500">query</span> existsRaise($id)</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>$raise : MyEvent( eventState == EventState.RAISE, eventId == $id )</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">end</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; min-height: 15px;"><br></div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(0, 143, 0);"><span style="color: #a91500">rule</span><span style="color: #000000"> </span>"process clear"</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span>no-loop</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">when</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>$clear : MyEvent(eventState == EventState.CLEAR, $clearId : eventId)</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">then</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>QueryResults results = kcontext.getKieRuntime().getQueryResults( <span style="color: #008f00">"existsRaise"</span>, $clearId );</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span><span style="color: #a91500">if</span> (results.size() == 0) {&nbsp;</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">                </span>System.out.println( <span style="color: #008f00">"Forwarding CLEAR("</span> + $clearId + <span style="color: #008f00">")"</span> );&nbsp;</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>} <span style="color: #a91500">else</span> {</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;">&nbsp; &nbsp; &nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span>System.out.println(<span style="color: #008f00">"Forgetting RAISE/CLEAR("</span> + $clearId + <span style="color: #008f00">")"</span>);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a91500">for</span> (QueryResultsRow row : results){</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;">&nbsp; &nbsp; &nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>MyEvent raise = (MyEvent) row.get (<span style="color: #008f00">"$raise"</span>);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;">&nbsp; &nbsp; &nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">                </span>delete(raise);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>delete($clear);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">end</div></div><div><br></div><div>This appears to be a similar situation to&nbsp;<a href="https://issues.jboss.org/browse/DROOLS-498">https://issues.jboss.org/browse/DROOLS-498</a>.</div><div><br></div><div><br></div><br><div><div>On Jul 10, 2014, at 3:54 PM, Kent Anderson &lt;<a href="mailto:kent.anderson@psware.com">kent.anderson@psware.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><meta http-equiv="Content-Type" content="text/html charset=windows-1252"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Correction: &nbsp;The original post did not include another rule that exists in the stream. &nbsp;The memory leak does not appear unless both rules are active in the stream.<div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span style="color: #a91500">declare</span> MyEvent&nbsp;</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;">&nbsp; @role(event)&nbsp;</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;">&nbsp; @timestamp(timestamp)&nbsp;</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">end<span style="">&nbsp;</span></div></div><div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(146, 144, 0);">/* If a RAISE is buffered for N seconds, send it out */</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(0, 143, 0);"><span style="color: #a91500">rule</span><span style=""> </span>"forward raise"</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);"><span style=""><span class="Apple-tab-span" style="white-space:pre">        </span></span>no-loop</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);"><span style=""><span class="Apple-tab-span" style="white-space:pre">        </span></span>duration<span style=""> (3s)</span></div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">when</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>$raise : MyEvent(eventState == EventState.RAISE, $raiseId : eventId)</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">then</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>System.out.println(<span style="color: #008f00">"Forwarding RAISE("</span> + $raiseId + <span style="color: #008f00">")"</span>);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>delete($raise);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">end</div></div><div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(146, 144, 0);">/* When CLEAR, and buffered, clear them both out */</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(0, 143, 0);"><span style="color: #a91500">rule</span><span style=""> </span>"forget it ever happened"</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);"><span style=""><span class="Apple-tab-span" style="white-space:pre">        </span></span>no-loop</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">when</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>$clear : MyEvent(eventState == EventState.CLEAR, $clearId : eventId)</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>$raise : MyEvent(eventState == EventState.RAISE, eventId == $clearId)</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">then</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>System.out.println(<span style="color: #008f00">"Forgetting RAISE/CLEAR("</span> + $clearId + <span style="color: #008f00">")"</span>);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>delete($clear);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>delete($raise);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">end</div></div><div><br></div><div><br><div><div>On Jul 10, 2014, at 2:50 PM, Kent Anderson &lt;<a href="mailto:kent.anderson@psware.com">kent.anderson@psware.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">The following rule produces a memory leak in Drools 6.1.0-SNAPSHOT:<div><br></div><div>(Stream mode)</div><div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span style="color: #a91500">declare</span> MyEvent&nbsp;</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;">&nbsp; @role(event)&nbsp;</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;">&nbsp; @timestamp(timestamp)&nbsp;</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">end<span style="">&nbsp;</span></div></div><div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(146, 144, 0);">/* If a RAISE is buffered for N seconds, send it out */</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(0, 143, 0);"><span style="color: #a91500">rule</span><span style=""> </span>"forward raise"</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);"><span style=""><span class="Apple-tab-span" style="white-space:pre">        </span></span>no-loop</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);"><span style=""><span class="Apple-tab-span" style="white-space:pre">        </span></span>duration<span style=""> (3s)</span></div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">when</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>$raise : MyEvent(eventState == EventState.RAISE, $raiseId : eventId)</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">then</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>System.out.println(<span style="color: #008f00">"Forwarding RAISE("</span> + $raiseId + <span style="color: #008f00">")"</span>);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;"><span class="Apple-tab-span" style="white-space:pre">        </span>delete($raise);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(169, 21, 0);">end</div></div><div><br></div><div><br></div><div>I see the rule fire as expected, printing out the message 3 seconds after the event is added into the session. &nbsp;While the event is waiting, I see a FactCount of 1 in the session. &nbsp;After the rule fires, the fact count goes to 0. &nbsp;However, using JVisualVm, querying the heap dump shows 1 instance of MyEvent, referenced by an EventFactHandle and several other Drools objects.</div><div><br></div><div>Is this a bug, or is there a better way to write this rule so Drools’ internals let go of the object after it is no longer a fact?</div><div><br></div><div><span>&lt;PastedGraphic-1.png&gt;</span></div><div><br></div><div><span>&lt;PastedGraphic-2.png&gt;</span></div></div>_______________________________________________<br>rules-users mailing list<br><a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br><a href="https://lists.jboss.org/mailman/listinfo/rules-users">https://lists.jboss.org/mailman/listinfo/rules-users</a></blockquote></div><br></div></div>_______________________________________________<br>rules-users mailing list<br><a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>https://lists.jboss.org/mailman/listinfo/rules-users</blockquote></div><br></body></html>