我是Java的新手。我正在阅读有关JVM预热的内容,并了解它指的是JVM查找热点所需的时间以及JIT代码的这些部分。
我也明白,为了做到这一点,我必须运行几百次测试。
但我不明白的事情如下:
如何在JVM完全预热之前确定测试应运行的次数?
这会将JVM更改为JVM吗?我的意思是,如果我能够通过运行1000次迭代来预热我的JVM,那么其他人可能最终需要更多或更少?
运行测试是预热JVM的唯一方法吗?
我应该什么时候预热JVM?我的意思是频率。我是否应该每次停止并启动应用程序,或者只是在重新启动服务器后执行一次?
这是我的第一个问题。我在发布之前阅读了指南。如果有任何错误,请提出修改建议。
答案 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
每个应用程序都不同,因此最好收集自己的数据。根据这些数据,您可以做出进一步的决定。