我有一个使用Nashorn的应用程序。就我的例子而言,我创建了一个ScriptContext,通过执行一些Javascript来创建一些全局变量,然后通过在紧密循环中调用NashornScriptEngine#eval(String, ScriptContext)
在单个线程中反复使用该上下文。我不会将结果存储在任何地方,只要我可以告诉我的应用程序代码不会导致任何副作用。为什么只有使用CMS垃圾回收器时,JVM才会减速?
默认的GC可以无限期地工作。但是当我运行与-XX:+UseConcMarkSweepGC
相同的应用程序时,性能会随着时间显着降低。程序启动时,大约需要2分钟来运行1,000,000次迭代。但2小时后,同样的1,000,000次迭代大约需要4分钟。它从那里继续变得更糟。
我也经常测试一起扔掉NashornScriptEngine实例和ScriptContext,完全从头开始。此时,我的应用程序没有引用前一次执行的任何变量。这不会改善这些性能问题。
任何想法是怎么回事?我需要与-XX:+UseConcMarkSweepGC
一起运行,因为这只是一个较大的长期应用程序的一小部分。
我从下面的Java Mission Control(从飞行记录器获取)中有一些截图。
谢谢!
在这里,我摘走2个选区,一个从记录的开始,一个从终点。请注意“JNI弱参考”时间与“GC暂停”一样是如何显着增加的。
如果这是一个CMS唯一的问题,你有没有试过G1?另外,哪个java版本?我认为CMS只开始使用java8进行类卸载。 – the8472