50 Star 445 Fork 372

ssssssss-team/magic-script

 / 详情

编译缓存并未将编译class进行缓存,导致非堆内存持续增长

已完成
创建于  
2022-05-27 16:11

在脚本运行时,每次都会对脚本进行编译成class进行加载,虽然现在有CompileCache,但是这个缓存并没有将编译的class进行缓存进去,导致堆外内存持续增长(前几天发现线上magic-api程序堆内存700M,但是堆外内存占用了3G多)

Class clazz = new MagicScriptClassLoader(Thread.currentThread().getContextClassLoader()).load(compiler.getClassName(), compiler.bytecode());

这里我目前是将Class clazz放在MagicScript当做全局变量本地缓存起来,CompileCache拿到MagicScript实例的时候优先用缓存好的class。目前观测还较为正常

评论 (6)

曹海兵 创建了任务 3年前

我们在使用中也遇到这个问题,metadata 区 会增长,只能靠FGC 去回收meta 区,这样导致FGC次数变得频繁,影响了性能,我跟代码,发现compile也可以缓存,那部分也是不变的,你可以试一下一下把

public Object execute(MagicScriptContext context) {
		MagicScriptRuntime runtime = null;
		try {
			MagicScriptEngine.getDefaultImports().forEach((name, value) -> {
				if (value instanceof DynamicModuleImport) {
					context.set(name, ((DynamicModuleImport) value).getDynamicModule(context));
				} else {
					context.set(name, value);
				}
			});
                        //这里可以用script key做缓存
			runtime = compile();
			return runtime.execute(context);
		} catch (MagicExitException e) {
			return e.getExitValue();
		} catch (MagicScriptCompileException e) {
			throw e;
		} catch (Throwable t) {
			MagicScriptError.transfer(runtime, t);
		}
		return null;
	}

您好,请问一下,你说的这里的script key是指context.getScriptName()么?

这个问题解决了吗?如果这样,那岂不magic-api也一样不能正式使用?

目前我是在这块将编译信息进行缓存,基本解决该问题

可否show一下代码~

aLIEz 通过合并 Pull Request !4: MagicScript缓存编译结果任务状态待办的 修改为已完成 3年前

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(5)
368464 zhangdc007 1578921730 wuhanhui-whhfly2003_admin 曹海兵-343959872 harley-harley_antzb chenweifeng-chenweifeng
Java
1
https://gitee.com/ssssssss-team/magic-script.git
git@gitee.com:ssssssss-team/magic-script.git
ssssssss-team
magic-script
magic-script

搜索帮助

371d5123 14472233 46e8bd33 14472233