Groovy大量计算导致oom的解决办法

博客讲述了在项目中遇到的内存持续增长问题,原因是大量调用Groovy脚本导致的内存泄漏。分析发现每次执行脚本会生成并加载一个随机类,而这些类无法被有效清理。为解决此问题,作者提出了一种预编译表达式的解决方案,通过缓存编译好的脚本避免重复编译,从而减少内存占用。此外,还提供了一个封装的GroovyEngine工具类以减少并发计算时的干扰,并附带了使用示例。

最近在项目中遇到一个内存持续增长的问题,系统启动后内存使用原本很低,但是在系统运行的过程中,内存一直在慢慢的增加,最后机器发出了内存预警,查看使用的内存,短短一个月居然达到了8G,并且jvm无法回收这些内存。

经过一系列排查,发现是大量调用groovy脚本计算导致的,使用visualVM监控jvm已加载的类数量:

发现每次调用脚本,都会增加一个类,导致堆内存一直增加,问题代码:

    public static ScriptEngine engine = new ScriptEngineManager().getEngineByName("groovy");
    public static Map<String,Bindings> bindingMap = new HashMap<>(1);
    ...
    //根据当前线程得到引擎
    public static Bindings getEngineBinding(){
        return getEngineBinding(getCurrentThread());
    }
    //根据当前线程得到引擎
    public static Bindings getEngineBinding(String threadNum){
        return bindingMap.computeIfAbsent(threadNum, k -> engine.createBindings());
    }
    //根据当前线程得到引擎
    public static String getCurrentThread(){
        return Thread.currentThread().getName();
    }
    //问题代码
    public stat
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值