aviatorscript icon indicating copy to clipboard operation
aviatorscript copied to clipboard

多次编译导致oom

Open Thintime opened this issue 1 year ago • 4 comments

aviator 版本 5.3.1,jdk11 代码如下

String express = "let a=math.pow((math.abs(c)+a*10)-100,2)+0.2;if(b==45){return a;}else {return -0.7;}";

    while (true) {
        Expression expression = AviatorEvaluator.compile(express);
        Map<String, Object> env = new HashMap<>();
        env.put("a", 100.3);
        env.put("b", 45);
        env.put("c", -199.100);
        Object result = expression.execute(env);
    }

这个程序执行最终会导致 OutOfMemoryError: Compressed class space

但是我看文档是说expression没有引用之后会触发gc卸载内部类,这个错误是啥原因导致的呢

Thintime avatar Jul 27 '22 12:07 Thintime

jdk 11 还没有测试过,我会调查看看

killme2008 avatar Aug 01 '22 07:08 killme2008

jdk 11 还没有测试过,我会调查看看

1.8经测试,同样有此问题

Thintime avatar Aug 01 '22 13:08 Thintime

你是 oracle jdk 吗? 我在 jdk8 测试没有问题

killme2008 avatar Aug 01 '22 14:08 killme2008

你是 oracle jdk 吗? 我在 jdk8 测试没有问题

open jdk

Thintime avatar Aug 02 '22 02:08 Thintime

同5.3.1版本,openjdk 11.0.8.10,因业务需要脚本需要频繁更新迭代。 废弃的缓存已经调用AviatorEvaluatorInstance#nvalidateCache(cacheKey)卸载,但还是会出现OutOfMemoryError: Metaspace

LiuXuTaoORZ avatar Sep 26 '22 11:09 LiuXuTaoORZ

基于上述demo代码,jdk版本切换至1.8.0_101,循环中新增200ms间隔进行测试,发现Metasoace占用还是会缓慢增加直至OOM,headdump中存在大量名称为类似Script_1664349841614_11750的类(最后一位从0开始)。

LiuXuTaoORZ avatar Sep 28 '22 07:09 LiuXuTaoORZ

收到,感谢反馈,有空会去调查下 openjdk

killme2008 avatar Sep 28 '22 09:09 killme2008

openjdk 11 和17 都做了尝试,导致OOM的并不是编译,编译产生的class可以正常清理掉; 但是执行阶段有问题,执行时ThreadLocal中产生了大量的com.googlecode.aviator.runtime.function.LambdaFunction 对象示例,无法GC,最终导致OOM

argan avatar Oct 08 '22 02:10 argan

跟这个 issue 有关系 https://github.com/killme2008/aviatorscript/issues/494

近期会修复下

killme2008 avatar Oct 09 '22 02:10 killme2008

5.3.3 发布,应该解决了这个问题

killme2008 avatar Oct 29 '22 05:10 killme2008