Java/JVM(HotSpot):是否有一种方法可以在编译时保存JIT的性能提升?

11

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

  • 前100K个消息,我每秒获得约3,000个消息
  • 后100K个消息,我每秒获得约4,500个消息。

我认为性能的提高是JIT优化执行路径的结果。

不保存JIT编译的原因是:“JVM执行的优化不是静态的,而是动态的,基于数据模式和代码模式。这些数据模式在应用程序的生命周期中可能会发生变化,使缓存的优化效果不佳。”

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

另请参阅相关的问题讨论


这是一个有点愚蠢的评论,但我还是要说一下来帮助辩论 - 我和其他人一样对知道答案很感兴趣! :) 我猜 JVM 执行的某些优化将取决于正在处理的数据。除非您的数据完全相同(包括到达时间),否则每次执行的优化可能会不同。如果数据始终相同,则只需要运行应用程序一次 :) - Rich
还有这个:https://dev59.com/hnI95IYBdhLWcg3wvgh9 - Rich
如果您知道虚拟机使用了哪些代码优化,并且您知道数据模式不会更改,那么您是否可以利用已优化的知识修改您应用程序的逻辑以体现它? - matt b
4个回答

6
你可以尝试将你的应用程序适配为使用Nailgun运行。与每次针对一个新JVM调用相比,你可以针对一个长期存在的Nailgun服务器调用它。第二次调用你的应用程序时,nailgun JVM会优化类中的路径,因此执行速度比起从头开始要快得多。

我没有使用Nailgun,但这似乎是最好的想法。 - Rudiger
1
Nailgun摒弃了所有安全概念,这可能或可能不重要。 - Thorbjørn Ravn Andersen

3

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


2

有几个选项可以调整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. 自定义编译阈值 控制函数调用次数,使其有资格进行JIT编译。 有关标记-XX:CompileThreshold的详细信息请参见。不要将此值设置为0或1。您在这里的篡改可能会导致性能下降。 JVM提供了选项。在-server上,默认值为10000。


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

2

您确定这与CPU有关,而不是IO有关吗?我已经多次看到这种情况,当访问某个冷缓存时会使性能变差。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接