Drools应用JoinNodeLeftTuple内存占用过高问题及优化咨询
Drools应用内存占用过高问题咨询
我正在开发基于Drools的应用,目前遇到内存占用过高问题,堆中存在大量JoinNodeLeftTuple对象,且其数量随目标事件数增长而剧增:例如5000个事件对应约250万个该对象,10000个事件则跃升至3100万个。
涉及规则示例
rule "Attack 50113 - Level 5 - ID 4" when $scenario: Scenario(sid == 50113, rid == 3) $prevLevel: Attack() from $scenario.lastAttack Number(this >= 4000) from accumulate( $a : RequestEvent(sourceIp == $scenario.getAttack(0).sourceIp, pluginId == 4003, pluginSid == 1, this after[1ms, 86400s] $prevLevel), count($a) ) $clock: PseudoClockScheduler() then ... end
排查情况
此前我曾将累积的RequestEvent存入ArrayList并保存到新创建的Attack对象中,移除该操作后垃圾回收未受明显影响。通过Eclipse Memory Analyzer分析堆转储后,确认这些元组对象的sink为accumulate节点,初步判断accumulate节点是问题根源。
疑问
- 规则中带时间窗口的accumulate是否是
JoinNodeLeftTuple内存占用过高的原因? - 是否有更内存高效的事件计数方式,可避免生成大量
JoinNodeLeftTuple对象?
补充说明
已搭建含5000条日志的示例仓库,用于复现该问题。
内容的提问来源于stack exchange,提问作者yuriz
相关产品推荐
相关产品推荐

