亲爱的读者您好,当你看到这篇文章时,相信你对drools已经有了一定的了解,也已经使用到您的项目中,很荣幸您也遇到了小哥曾经遇到过的问题,嘿嘿,接下来小哥说一下我曾经遇到的问题。
小哥的drools运用的比较复杂,因为业务所需,drools可以分为几个模块,小编用到了其中的drools fusion,用这个东西可以做一套cep系统,drools cep相关内容小哥会专门写一篇文章,欢迎读者浏览。小哥用到了一个时间窗口和长度窗口的概念,比如要看最近十分钟的数据,最近10条数据,所以要求数据常驻内存,所以小哥在设计时,就没释放资源,只创建了一个KieSession,一个会话,是全局的。刚开始小哥为了避免内存溢出,给每个插入drools内存的fact设置了过期时间,比如三分钟,三分钟后就会自动从会话移除,并释放相关资源,但是项目在线上运行了一段时间后,发生了内存溢出的现象,小哥经过仔细的内存分析,发现是drools导致的,过期机制不生效,过期时间到后,还有一些资源没释放,比如引用句柄。最终小哥重新拟定了技术方案,完美的解决了此问题。小哥的策略是,定时释放内存,也就是定时重新创建会话,释放之前的会话,由于小哥业务的特殊性,只能这样。
当然,也有人业务没那么特殊,可能也会遇到内存溢出的可能,小哥只说两点,如果你的数据在内存使用一次,就不使用了,那么insert完后一定要调用delete方法,再调用dispose方法,如图所示:
第二点,当规则改变时如果需要重新创建会话,记得把之前会话资源释放,调用dispose即可。