问题 Java / JVM(HotSpot):有没有办法在编译时保存JIT性能增益?


当我测量Java应用程序的吞吐量时,我发现随着时间的推移,性能提高了50%:

  • 对于前100K消息,我每秒收到大约3,000条消息
  • 对于第二个100K消息,我每秒收到约4,500条消息。

我相信随着JIT优化执行路径,性能会提高。

给出的理由  保存JIT编译是“JVM执行的优化不是静态的,而是动态的,基于数据模式和代码模式。这些数据模式可能会在应用程序的生命周期内发生变化,从而减少缓存的优化比最佳。“

但是,我知道这些数据模式在我的应用程序生命周期内,甚至在多个应用程序生命周期内都不会改变。那么如何在HotSpot JVM中“保存”这些性能提升呢?

另见,相关  和 讨论


2309
2017-09-23 14:19


起源

这是一个稍微愚蠢的评论,但我还是会说它只是为了帮助辩论 - 我有兴趣知道答案和其他人一样! :)我猜想JVM执行的某些优化将取决于正在处理的数据。除非您的数据相同(包括它的到达时间),否则每次执行的优化可能会有所不同。如果数据总是相同的,那么你只需要运行一次app :) - Rich
还有这个: stackoverflow.com/questions/2178640/... - Rich
如果您知道VM对代码进行了哪些优化,并且您知道数据模式不会发生变化,那么您是否可以使用优化后的知识并修改应用程序的逻辑来反映它? - matt b


答案:


你可以尝试调整你的应用程序来运行它 钉枪。每次在Nailgun服务器(一个长期存在的JVM)上调用它时,都不会针对新的JVM调用您的应用程序。第二次调用你的应用程序时,nailgun JVM将优化你的类中的路径,因此应该比新的更快地执行。


6
2017-09-23 15:34



卓见! - Rich
我没有使用Nailgun,但这似乎是最好的主意。 - Rudiger
Nailgun会抛弃所有安全概念,这对您来说可能或不重要。 - Thorbjørn Ravn Andersen


使用'-server'可以提前做更多事情。据我所知,Hotspot不允许在运行之间保存jit信息,因此-server是告诉它你想要它做什么的最简单方法。


3
2017-09-23 15:39





您确定它与CPU有关而与IO无关吗?我已经多次看到过这种行为,当某个地方遇到冷缓存会使性能恶化。


2
2017-09-23 18:23





调整JIT的选择很少。

1.类数据共享 http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/index.jsp?topic=%2Fcom.ibm.java.doc.user.aix64.60%2Fuser%2Fclassdatasharing.html

2.分层编译 查看旗帜的详细信息 -XX:+ TieredCompilation 

3.自定义CompileThreshold 控制使其符合JIT编译条件的函数的调用次数。 查看旗帜的详细信息 -XX:CompileThreshold。永远不要把它变成零或一个。您在此处的篡改可能会导致性能下降。 JVM为您提供了选项。 -server默认为10000。


2
2017-07-26 21:02



据我所知,类数据共享功能是IBM JVM特有的。 - Thorbjørn Ravn Andersen