Nashorn Javascript引擎使用cpu在一分钟后加载类?
使用Java8u60,nashorn 目标是每500毫秒让大约2000个函数对象与各自的API对象交互。每个脚本大约有5到20行代码 我看到的是,在用于编译脚本的CPU使用量最初激增之后,它运行得非常好。但大约一分钟后,CPU使用量再次激增,大量类正在加载 我想知道为什么会发生这种情况(因为它已经被正确地编译过了?),以及有什么方法可以影响这种现象 下面是使用JvisualVM看到的效果。Nashorn Javascript引擎使用cpu在一分钟后加载类?,javascript,java,performance,nashorn,Javascript,Java,Performance,Nashorn,使用Java8u60,nashorn 目标是每500毫秒让大约2000个函数对象与各自的API对象交互。每个脚本大约有5到20行代码 我看到的是,在用于编译脚本的CPU使用量最初激增之后,它运行得非常好。但大约一分钟后,CPU使用量再次激增,大量类正在加载 我想知道为什么会发生这种情况(因为它已经被正确地编译过了?),以及有什么方法可以影响这种现象 下面是使用JvisualVM看到的效果。 最初: 一分钟后大约加载10000个类。请参见右下角图表中的cpu使用率和峰值: 一些细节: 每个函数
最初:
一分钟后大约加载10000个类。请参见右下角图表中的cpu使用率和峰值:
一些细节:
每个函数对象都有自己的
SimpleScriptContext
我使用
Swingworkers
首先编译,然后在下次调用时执行编译后的函数。我每个线程有一个
ScriptEngine
实例(Swingworkers
使用JDK硬编码的10个线程池),希望编译不会阻塞其他线程。每个
SwingWorker
实例只对具有相同脚本文本的所有函数对象执行一次CompiledScript
,然后退出(大约有30个唯一脚本)。这些SwingWorker每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());
}
一分钟后将加载哪些类?检查
-XX:+TraceClassLoading
。最初,它显示了大量包含[Loaded java.lang.invoke.LambdaForm$DMH/3175035 from java.lang.invoke.LambdaForm]
的行,但在加载的类的峰值时,它主要表示BMH探查器代理警告:JVMTI classLoadHook:类名为空。[从java.lang.invoke.LambdaForm加载的java.lang.invoke.LambdaForm$BMH/19678099][从java.lang.invoke.LambdaForm加载的java.lang.invoke.LambdaForm$BMH/586680][从java.lang.invoke.LambdaForm加载的java.lang.invoke.LambdaForm$BMH/27194906][/code>可能的重复项