killme2008 / aviatorscript

A high performance scripting language hosted on the JVM.
http://fnil.net/aviator/
4.45k stars 831 forks source link

多次编译导致oom #481

Closed Thintime closed 1 year ago

Thintime commented 2 years ago

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卸载内部类,这个错误是啥原因导致的呢

killme2008 commented 2 years ago

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

Thintime commented 2 years ago

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

1.8经测试,同样有此问题

killme2008 commented 2 years ago

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

Thintime commented 2 years ago

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

open jdk

LiuXuTaoORZ commented 1 year ago

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

LiuXuTaoORZ commented 1 year ago

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

killme2008 commented 1 year ago

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

argan commented 1 year ago

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

killme2008 commented 1 year ago

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

近期会修复下

killme2008 commented 1 year ago

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