如何在特定时刻强制/确保Java热点JIT编译

4

我目前感兴趣的问题是对某段代码进行分析/优化。Java的一般建议是“运行”,“等待一段时间让热点JIT编译器完成其工作”,“重复测试”...

因此,问题是:

  • 我需要等待多长时间才能启动和完成热点编译?
  • 当CPU被其他线程占用时,JIT是否会运行?-在实际生活中,进程可能会持续将CPU负载达到100%。
  • 需要执行多少次相同的代码才能确定“热点”?
  • 是否可以通过某些神奇的方式(可能使用Oracle JVM的某些专有API)来触发某些类的JIT编译?

你最好使用一个预先构建的框架来处理所有这些问题,比如Caliper - Louis Wasserman
1
尝试使用JMH(Java微基准测试工具)http://tutorials.jenkov.com/java-performance/jmh.html - D3Hunter
@LouisWasserman Caliper 被证明是 Google 设计不当的。它无法优雅地处理 OSR。JMH 是 Java 微基准测试的黄金标准。 - Wojciech Kudla
@WojciechKudla:在撰写该评论的时候,JMH甚至还没有发布0.1版本。我同意JMH是当今的黄金标准。 - Louis Wasserman
1个回答

0
我需要等待多久才能启动热点并完成其工作?
大约需要10,000次调用/迭代和几毫秒的时间。
当CPU被其他线程占用时,JIT是否会运行? - 在现实生活中,进程不断将CPU负载提高到100%可能会发生。
是的,可能需要更长时间,但在100%的CPU上执行测试通常是一个好主意,因为结果不太可能代表您在生产中要做的事情。
需要多少次执行相同的代码才能确定“热点”?
如果可能的话,我会等到代码预热。真实的测试数据,高CPU利用率的几秒钟和一个不错的分析器通常就足够了。
是否有可能通过某种神奇的方式(可能使用Oracle JVM的某些专有API)触发某些类的JIT编译?
除了多次运行之外,没有其他方法。过早地编译类可能会导致次优代码。代码是根据其使用方式进行优化的。 JRockit(也由Oracle拥有)具有/曾经具有这样的功能。

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