Nashorn Javascript引擎使用cpu在一分钟后加载类?

Nashorn Javascript引擎使用cpu在一分钟后加载类?,javascript,java,performance,nashorn,Javascript,Java,Performance,Nashorn,使用Java8u60,nashorn 目标是每500毫秒让大约2000个函数对象与各自的API对象交互。每个脚本大约有5到20行代码 我看到的是,在用于编译脚本的CPU使用量最初激增之后,它运行得非常好。但大约一分钟后,CPU使用量再次激增,大量类正在加载 我想知道为什么会发生这种情况(因为它已经被正确地编译过了?),以及有什么方法可以影响这种现象 下面是使用JvisualVM看到的效果。 最初: 一分钟后大约加载10000个类。请参见右下角图表中的cpu使用率和峰值: 一些细节: 每个函数

使用Java8u60,nashorn

目标是每500毫秒让大约2000个函数对象与各自的API对象交互。每个脚本大约有5到20行代码

我看到的是,在用于编译脚本的CPU使用量最初激增之后,它运行得非常好。但大约一分钟后,CPU使用量再次激增,大量类正在加载

我想知道为什么会发生这种情况(因为它已经被正确地编译过了?),以及有什么方法可以影响这种现象

下面是使用JvisualVM看到的效果。
最初:

一分钟后大约加载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>可能的重复项