在我们努力从Java 6(u39)迁移到Java 8(u51)的过程中,我们面临的问题是,与8相比,Java 8的预热时间更长。
我们注意到这一点都是作为Java程序运行的性能测试,以及使用Java 8启动Tomcat 7(u35)时的初始请求。
我们在Linux Redhat 64位系统上运行。
对不起,我没有任何孤立的测试用例。
关于性能测试程序,我发现Java 6在10次迭代中接近稳态性能大约215毫秒,而Java 8在10次迭代后需要800毫秒,并且需要70多次迭代才能达到215 ms。
当我们在重新启动Java 6后立即在我们的tomcat webapp(使用Spring 2.5,jackson,xerces XML解析器,jedis等)上以10的并发性运行JMeter测试时花了不到一分钟的时间来提供稳态性能Java 8花了大约5-6分钟,然后慢了几个数量级。
使用-XX关闭分层编译:-TieredCompilation VM 8中的HotSpot选项修复了性能测试程序的预热问题,而稳态性能没有变化。这是令人惊讶的,因为分层编译实际上应该给予更快的热身。
但是,关闭分层编译并没有给Tomcat服务器的预热时间带来类似的改进。
我欢迎任何修复此问题的建议,因为在实时环境中部署新版本可能会成为一个长时间预热的麻烦。
谢谢, 苏雷什
答案 0 :(得分:1)
这是令人惊讶的,因为分层编译实际上应该给予更快的热身。
您会混淆时间峰值性能和初始化/响应时间应用程序。
+ Tiered
-Tiered
另一件事是编译器线程的数量(CICompilerCount
)。性能权衡很复杂,因此简单地对各种设置进行基准测试可能会有所帮助。