【问题标题】:Java/JVM (HotSpot): Is there a way to save JIT performance gains at compile time?Java/JVM (HotSpot):有没有办法在编译时节省 JIT 性能增益?
【发布时间】:2011-04-16 07:30:37
【问题描述】:

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

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

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

保存 JIT 编译的原因是“JVM 执行的优化不是静态的,而是动态的,基于数据模式和代码模式。很可能是这些数据模式将在应用程序的生命周期内发生变化,导致缓存的优化不是最优的。”

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

另请参阅相关的questiondiscussion

【问题讨论】:

  • 这是一个有点愚蠢的评论,但我还是要说出来只是为了帮助辩论 - 我和其他人一样有兴趣知道答案! :) 我猜 JVM 执行的某些优化将取决于正在处理的数据。除非您的数据相同(包括它到达的时间),否则每次执行的优化都可能不同。如果数据始终相同,那么您只需运行应用程序一次 :)
  • 如果您知道虚拟机对您的代码进行了哪些优化,并且您知道数据模式不会改变,那么您是否可以使用已优化的知识并修改应用程序的逻辑反映它?

标签: java performance jvm compilation jit


【解决方案1】:

您可以尝试调整您的应用以使用Nailgun 运行它。而不是每次针对一个长期存在的 JVM 的 Nailgun 服务器调用您的应用程序时针对一个新的 JVM 调用它。第二次调用您的应用时,nailgun JVM 将优化您的类中的路径,因此执行速度应该比刚开始时快得多。

【讨论】:

  • 我没有使用 Nailgun,但这似乎是最好的主意。
  • Nailgun 抛弃了所有的安全概念,这对你来说可能很重要,也可能无关紧要。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你确定是 CPU 相关而不是 IO 相关吗?我已经多次看到这种行为,当在某个地方遇到冷缓存会降低性能时。

    【讨论】:

      【解决方案4】:

      调整 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 的详细信息。永远不要把它变成零或一。您在此处篡改可能会导致性能下降。 JVM 为您提供了选择。 -server 默认为 10000。

      【讨论】:

      • 据我所知,类数据共享功能是 IBM JVM 特有的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多