The following rule produces a memory leak in Drools 6.1.0-SNAPSHOT:

(Stream mode)

declare MyEvent 
  @role(event) 
  @timestamp(timestamp) 
end 

/* If a RAISE is buffered for N seconds, send it out */
rule "forward raise"
no-loop
duration (3s)
when
$raise : MyEvent(eventState == EventState.RAISE, $raiseId : eventId)
then
System.out.println("Forwarding RAISE(" + $raiseId + ")");
delete($raise);
end


I see the rule fire as expected, printing out the message 3 seconds after the event is added into the session.  While the event is waiting, I see a FactCount of 1 in the session.  After the rule fires, the fact count goes to 0.  However, using JVisualVm, querying the heap dump shows 1 instance of MyEvent, referenced by an EventFactHandle and several other Drools objects.

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?