使用Java8u60,nashorn
目标是每500毫秒有大约2000个函数对象与每个自己的API对象进行交互。每个脚本大约有5到20行代码。
我所看到的是,在用于编译脚本的初始CPU使用率之后,它运行得非常好。但是大约一分钟后,CPU使用率再次爆发,并且正在加载大量的类。
我想知道为什么会发生这种情况(因为它已经被编译好了吗?),以及有什么方法可以影响这种现象。
一分钟后,加载了大约10000个课程。请参阅右下角图中的cpu使用情况和峰值:
一些细节:
每个函数对象都有自己的SimpleScriptContext
我使用Swingworkers
首先编译,然后在下次调用时执行编译函数
我在每个线程中有一个ScriptEngine
实例(Swingworkers
使用在JDK中硬编码的10个线程的池),希望编译不会阻塞其他线程。
每个SwingWorker
实例对所有具有相同脚本文本的函数对象执行一次CompiledScript
,然后退出。(大约有30个独特的脚本。)
这些SwingWorkers每500毫秒实例化并执行一次
这是我用于执行函数对象的代码:
/*
* test for script change, if so, recompile
*/
if (e.cCompiledScript == null) {
/* compile once, but don't when an error is not cleared */
if (runner.cErrorString == null) {
e.initCompiledScript(runner.getScript());
}
} else {
/* run the CompiledScript in the (shared)engine with the provided private context */
e.cCompiledScript.eval(runner.getScriptContext());
}