JVM热身查询

时间:2016-04-02 07:28:52

标签: java jvm

我是Java的新手。我正在阅读有关JVM预热的内容,并了解它指的是JVM查找热点所需的时间以及JIT代码的这些部分。

我也明白,为了做到这一点,我必须运行几百次测试。

但我不明白的事情如下:

  1. 如何在JVM完全预热之前确定测试应运行的次数?

  2. 这会将JVM更改为JVM吗?我的意思是,如果我能够通过运行1000次迭代来预热我的JVM,那么其他人可能最终需要更多或更少?

  3. 运行测试是预热JVM的唯一方法吗?

  4. 我应该什么时候预热JVM?我的意思是频率。我是否应该每次停止并启动应用程序,或者只是在重新启动服务器后执行一次?

  5. 这是我的第一个问题。我在发布之前阅读了指南。如果有任何错误,请提出修改建议。

3 个答案:

答案 0 :(得分:4)

  

如何在JVM完全预热之前确定测试运行的次数?

假设你有默认的-XX:CompileThreshold=10000,可以触发一个方法,在10000个调用之后编译,或者你有一个迭代10,000次的循环。这在后台排队等待编译,因此在运行优化代码之前可能需要12K - 20K次迭代。

注意:JIT可以重新优化代码,即使经过10K或100万次迭代,您也可能会看到时序变化。

  

这会将JVM更改为JVM吗?我的意思是,如果我能够通过运行1000次迭代来预热我的JVM,那么其他人可能最终需要更多或更少?

是。如果您做的比您认为的更多,那么这是覆盖更多配置的最佳方式。

  

运行测试是预热JVM的唯一方法吗?

你应该真正理想地运行真正的代码。运行测试可以更好地减少预热代码的影响,因此在生产中更加实用。

  

我什么时候应该预热JVM?我的意思是频率。我是否应该每次停止并启动我的应用程序,或者只是在重新启动服务器后执行一次?

每当你启动JVM时,你都是从头开始的。即使相同的JVM已在运行,或者您从另一个JVM中生成了一个。

答案 1 :(得分:3)

首先,你不应该担心生产环境中的预热/强制编译方法,因为让我们面对它 - JIT比我们更聪明:P。

  

如何确定测试应该在我之前运行的次数   JVM是完全热身的吗?

在Mac上的Java 8上,对于要进行JIT编译的方法,需要大约256次迭代(假设该方法能够进行JIT编译)。这个数字可能因JVM而异。

  

这会将JVM更改为JVM吗?我的意思是,如果我能够这样做,那是可能的   通过运行1000次迭代来预热我的JVM然后其他人可能会结束   需要更多还是更少?

可能从JVM更改为JVM。假设这个数字对于不同的JVM保持不变是不安全的。

  

运行测试是预热JVM的唯一方法吗?

好吧,如果你正在尝试对某些东西进行基准测试,那么是的。您应该让JVM优化它(通过使用预热运行),然后测量性能。

  

我什么时候应该预热JVM?我的意思是频率。我应该这样做吗?   每次我停止和启动我的应用程序或只是一次   重新启动我的服务器?

每次你想要进行基准测试(例如,在JVM / app启动时)。我认为在生产环境中没有理由这样做。请注意,在某些情况下,如果JIT在其假设中发现缺陷,那么JIT实际上可能更喜欢解释方法而非编译方法。

答案 2 :(得分:1)

  

如何在JVM完全预热之前确定测试运行的次数?

  • 衡量应用程序逻辑的延迟和吞吐量,并查看它何时结束
  • 使用server.js
  • 跟踪JIT行为

每个应用程序都不同,因此最好收集自己的数据。根据这些数据,您可以做出进一步的决定。