48 Star 421 Fork 330

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)

曹海兵 创建了任务

我们在使用中也遇到这个问题,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一下代码~

大神您好,我也遇到同样的内存过大问题,可否发一下代码,非常感谢!邮箱:19476922@qq.com

登录 后才可以发表评论

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

搜索帮助

Cb406eda 1850385 E526c682 1850385