Используя Java8u60, nashorn
Цель состоит в том, чтобы около 2000 функциональных объектов взаимодействовали с каждым собственным объектом API каждые 500 мсек. Каждый сценарий представляет собой от 5 до 20 строк кода.
Я вижу, что после первоначального всплеска использования ЦП, использованного для компиляции скрипта, он работает довольно хорошо. Но примерно через минуту происходит еще один всплеск использования ЦП, и загружается огромное количество классов.
Я хотел бы знать, почему это происходит (потому что он уже был скомпилирован, верно?), И как можно повлиять на это явление.
Ниже показан эффект при использовании JvisualVM.
Первоначально:
Через минуту загружается около 10000 классов. См. Использование ЦП и всплески в правом нижнем углу графика:
Некоторые детали:
Каждый объект-функция имеет свой собственный SimpleScriptContext
.
Я использую Swingworkers
для первой компиляции, а при следующих вызовах выполняю скомпилированную функцию.
У меня есть ScriptEngine
экземпляра на поток (Swingworkers
используйте пул из 10 потоков, жестко запрограммированных в JDK) в надежде, что компиляция не заблокирует другие потоки.
Каждый экземпляр 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());
}
-XX:+TraceClassLoading
. - person apangin   schedule 27.03.2016[Loaded java.lang.invoke.LambdaForm$DMH/3175035 from java.lang.invoke.LambdaForm]
, но на пике загрузки классов он говорит в основном о BMHProfiler Agent Warning: JVMTI classLoadHook: class name is null. [Loaded java.lang.invoke.LambdaForm$BMH/19678099 from java.lang.invoke.LambdaForm] [Loaded java.lang.invoke.LambdaForm$BMH/586680 from java.lang.invoke.LambdaForm] [Loaded java.lang.invoke.LambdaForm$BMH/27194906 from java.lang.invoke.LambdaForm]
- person Houtman   schedule 29.03.2016