我将我的应用程序中的一些代码从Rhino移植到Nashorn(主要是为了跟上现代时尚,而不是在Rhino中缺乏功能),并且我在Nashorn中的表现非常差。
我的应用程序在运行时编译了LESS文件集(内容是动态的,因此无法预编译)。这在启动时完成一次,每次在运行时检测到更改。
Rhino提供相当一致的性能大约4-5秒(JS脚本加载了最高的Rhino优化)。
Nashorn提供了一些绝对奇怪的结果 - 大约15-17秒,但在第10次迭代后大约10分钟的时间表现变得相当不错 - 大约3秒。但是由于最初的缓慢,我使用Nashorn的应用程序通常比使用Rhino大约长30秒(还编译了其他LESS文件)。所以问题是:
我能做什么强制Nashorn立即执行脚本的最高优化,而不是在第10-20次迭代之后?
以下是日志文件的时间
2015-11-11 09:29:16,419 compile(less, styles.less) = 15179ms
--------------------------------------------------------------
15.179 % compile (styles.less)
--------------------------------------------------------------
13.940 91.8% less-rhino-ji.js lessFileToCss(styles.less)
1.227 8.0% YUICompressor minify(styles.less)
2015-11-11 09:30:12,900 compile(less, styles.less) = 13274ms
--------------------------------------------------------------
13.274 % compile (styles.less)
--------------------------------------------------------------
11.605 87.4% less-rhino-ji.js lessFileToCss(styles.less)
1.664 12.5% YUICompressor minify(styles.less)
2015-11-11 09:30:43,705 compile(less, styles.less) = 6906ms
--------------------------------------------------------------
6.906 % compile (styles.less)
--------------------------------------------------------------
5.695 82.4% less-rhino-ji.js lessFileToCss(styles.less)
1.205 17.4% YUICompressor minify(styles.less)
2015-11-11 09:31:09,194 compile(less, styles.less) = 6041ms
--------------------------------------------------------------
6.041 % compile (styles.less)
--------------------------------------------------------------
4.622 76.5% less-rhino-ji.js lessFileToCss(styles.less)
1.412 23.3% YUICompressor minify(styles.less)
2015-11-11 09:31:49,558 compile(less, styles.less) = 7619ms
--------------------------------------------------------------
7.619 % compile (styles.less)
--------------------------------------------------------------
3.056 40.1% less-rhino-ji.js lessFileToCss(styles.less)
4.555 59.7% YUICompressor minify(styles.less)
2015-11-11 09:36:25,586 compile(less, styles.less) = 5226ms
--------------------------------------------------------------
5.226 % compile (styles.less)
--------------------------------------------------------------
4.104 78.5% less-rhino-ji.js lessFileToCss(styles.less)
1.116 21.3% YUICompressor minify(styles.less)
2015-11-11 09:36:40,745 compile(less, styles.less) = 3839ms
--------------------------------------------------------------
3.839 % compile (styles.less)
--------------------------------------------------------------
2.664 69.3% less-rhino-ji.js lessFileToCss(styles.less)
1.169 30.4% YUICompressor minify(styles.less)
2015-11-11 09:37:02,876 compile(less, styles.less) = 3074ms
--------------------------------------------------------------
3.074 % compile (styles.less)
--------------------------------------------------------------
1.948 63.3% less-rhino-ji.js lessFileToCss(styles.less)
1.120 36.4% YUICompressor minify(styles.less)
2015-11-11 09:37:29,140 compile(less, styles.less) = 4773ms
--------------------------------------------------------------
4.773 % compile (styles.less)
--------------------------------------------------------------
3.682 77.1% less-rhino-ji.js lessFileToCss(styles.less)
1.085 22.7% YUICompressor minify(styles.less)
2015-11-11 09:37:51,768 compile(less, styles.less) = 2761ms
--------------------------------------------------------------
2.761 % compile (styles.less)
--------------------------------------------------------------
1.661 60.1% less-rhino-ji.js lessFileToCss(styles.less)
1.094 39.6% YUICompressor minify(styles.less)
2015-11-11 09:38:19,053 compile(less, styles.less) = 2743ms
--------------------------------------------------------------
2.743 % compile (styles.less)
--------------------------------------------------------------
1.639 59.7% less-rhino-ji.js lessFileToCss(styles.less)
1.098 40.0% YUICompressor minify(styles.less)
更新: 根据Olipro的推荐,我开始使用以下参数进行处理:
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation ...
结果并不是绝对清楚 - Nashorn生成的类的名称就像jdk.nashorn.internal.scripts.Script$Recompilation$438$121292A$\^eval\_::L:3187$toCSS
,但是只是通过方法名称我看到在该文件中最长时间编译CSS文件(4.4秒)时运行该方法toCSS()
被重新编译了5次,似乎有两个后台线程并行编译同一方法的不同版本(对我来说有点奇怪) - 很可能这确实是导致性能不佳的根本原因。
仍然 - 没有暗示如何提高启动性能:(
日志中的行(1st column = ms从jvm开始):
11100 5677 jdk.nas...tion$438$121292A$\^eval\_::L:3187$toCSS (103 bytes)
11119 5682 jdk.nas...tion$446$150019A$\^eval\_::L:4147$toCSS (137 bytes)
11377 5677 jdk.nas...tion$438$121292A$\^eval\_::L:3187$toCSS (103 bytes) made not entrant
11507 5677 jdk.nas...tion$438$121292A$\^eval\_::L:3187$toCSS (103 bytes) made zombie
11932 5798 jdk.nas...tion$438$121292A$\^eval\_::L:3187$toCSS (103 bytes)
13381 5798 jdk.nas...tion$438$121292A$\^eval\_::L:3187$toCSS (103 bytes) made not entrant
14272 5798 jdk.nas...tion$438$121292A$\^eval\_::L:3187$toCSS (103 bytes) made zombie
14778 5682 jdk.nas...tion$446$150019A$\^eval\_::L:4147$toCSS (137 bytes) made not entrant
14860 6049 jdk.nas...tion$438$121292A$\^eval\_::L:3187$toCSS (103 bytes)
14890 6056 jdk.nas...tion$446$150019A$\^eval\_::L:4147$toCSS (137 bytes)
15019 5682 jdk.nas...tion$446$150019A$\^eval\_::L:4147$toCSS (137 bytes) made zombie
15223 6162 jdk.nas...tion$457$121460$\^eval\_::L:3187$toCSS$isEmpty (31 bytes)
答案 0 :(得分:0)
这听起来像是Java JIT的受害者。一般情况下,Java在对其进行分析之前不会使用JIT代码,这听起来就像那种情况。
现在,在启动JRE时可以传递 选项,以强制它使用-Xcomp
进行本机编译,或者使用-XX:CompileThreshold
进行较少的运行后进行本地编译一般不推荐。
如果所有JVM实例都只是一个美化的编译器,你可以合理地逃避尝试-Xcomp
,但是如果你的程序预计会存在很长时间,那么就让它成为现实。无论如何,我当然建议传递-server