【发布时间】:2017-08-26 02:50:37
【问题描述】:
我有一个使用 Nashorn 的应用程序。出于我的示例的目的,我创建了一个 ScriptContext,我通过执行一些 Javascript 来创建一些全局变量,然后通过在紧密循环中调用 NashornScriptEngine#eval(String, ScriptContext) 在单个线程中一遍又一遍地使用该上下文。我不会将结果存储在任何地方,据我所知,我的应用程序代码不会造成任何副作用。
使用默认的 GC 可以无限期地正常工作。但是当我使用-XX:+UseConcMarkSweepGC 运行相同的应用程序时,性能会随着时间的推移而显着下降。程序启动时,运行 1,000,000 次迭代大约需要 2 分钟。但 2 小时后,同样的 1,000,000 次迭代大约需要 4 分钟。从那里开始变得更糟。
我还测试了定期丢弃 NashornScriptEngine 实例和 ScriptContext,完全重新开始。那时,我的应用程序没有引用上一次执行中的任何变量。这并不能改善这些性能问题。
知道发生了什么吗?我需要使用-XX:+UseConcMarkSweepGC 运行,因为这只是一个较大的长期应用程序的一小部分。
我有一些来自下面 Java Mission Control 的屏幕截图(取自 Flight Recorder)。
谢谢!
这里我选择了两个 GC,一个从录音的开头,一个从结尾。请注意“JNI 弱引用”时间是如何显着增加的,“GC 暂停”也是如此。
【问题讨论】:
-
如果这是仅 CMS 的问题,您是否尝试过 G1?另外,哪个java版本?我认为CMS默认情况下才开始使用java8进行类卸载。
标签: java performance garbage-collection jvm nashorn