[rules-users] DROOLS-516 - Continued Memory Leak problem Drools 6.1.0.

Davide Sottara dsotty at gmail.com
Tue Jul 22 18:54:52 EDT 2014


Ack'd and queued.

On 07/22/2014 11:46 PM, Kent Anderson wrote:
> It appears there is another condition where Drools holds onto memory
> indefinitely. (See https://issues.jboss.org/browse/DROOLS-516)
>
> Use case: We have a set of rules designed to detect a heartbeat, then
> report when/if the heartbeat stops.
>
> Problem: In the normal case of a constant heartbeat, memory is
> retained in the JVM, even though the fact count in working memory is 1.
>
> The following rules produce this problem.  I have attached a test
> project that demonstrates this problem.  600K events are inserted into
> the stream, then the test driver waits.  After 10 seconds, the
> "absence detected" rule fires.  Requesting a GC via JMC has no effect.
>  If you hit a key while the test driver is waiting, a new event will
> be added, which will cause the "clear absence alarm" rule to fire.  At
> this point some memory is freed automatically.  Requesting another GC
> removes all memory and the JVM is back in its (nearly) new condition.
>
> We consider this a memory leak since the events are gone from working
> memory and will no longer be considered in any rule evaluations, but
> they are still active somewhere in the JVM.
>
> packageorg.drools.example.api.kiemodulemodel 
>
> import demo.Event 
>
> declareEvent
>     @role( event )
>     @timestamp( timestamp )
> end
>
> declare Heartbeat
> @role( event )
> @timestamp( event.timestamp )
> event   : Event
> end
>
> declare AbsenceDetected
>     name    : String
> end
>
> /*
>  * This rule matches the first event
>  *
>  * NOTE: This stream requires the heartbeat event
>  * to occur at least once before absence will be detected.
>  */
> rule"detect first heartbeat"
> when
> $event : Event()
> not ( Heartbeat() )
> then
> delete($event);
> insert(new Heartbeat($event));
> System.out.println("[DFH] Got event: " + $event.getEventId());
> end
>
>
> /*
>  * This rule matches every event and stores only the most recent
>  * as the heartbeat.
>  */
> rule"keep latest heartbeat"
> when
> $heartbeat : Heartbeat()
> $event : Event()
> then
> delete($heartbeat);
> insert(new Heartbeat($event));
> System.out.println("[KLH] Got event: " + $event.getEventId());
> delete($event);
> end
>
>
> /*
>  * This rule detects when a heartbeat stops for 10s
>  */
> rule"detect absence"
> duration(10s)
> when
> $heartbeat : Heartbeat()
>     not ( Event() )
>     not (AbsenceDetected() )
> then
>     delete($heartbeat);
>     insert(new AbsenceDetected("Absence"));
>     System.out.println("[DA] Absence detected");
> end
>
> /*
>  * This rule detects when the heartbeat starts again after 
>  * absence has been detected.
>  */
> rule"clear absence alarm"
> when
> $heartbeat : Heartbeat()
>     $absence : AbsenceDetected ()
> then
> delete($absence);
> System.out.println("[CAA] Heartbeat restored");
> end
>
>
>
>
>
>
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20140723/92b0bbd5/attachment.html 


More information about the rules-users mailing list