为什么JVM需要热身?
现代(J)VM在运行时收集统计信息,了解哪些代码最常用以及如何使用。其中一个(如果不是成千上万)例子是对虚拟函数调用的优化(用C++术语),它们只有在实现时才有效。这些统计信息只能在运行时收集。
类加载本身是热身的一部分为好,但它显然是这些类里面的代码执行前会自动进行,所以没有太多的担心
代码的哪些部分应该你热身?
这是你的应用程序的性能是至关重要的组成部分。最重要的部分是“正常地使用它”,正如它在正常使用中使用的方式一样,否则错误的优化将会完成(并在稍后撤消)。
即使我对代码的某些部分进行了预热,它会保持多长时间(假设这个术语仅表示类对象保留在内存中的时间)?
这实在很难说基本上JIT编译器会持续监视执行和性能。如果达到某个阈值,它会尝试优化。然后它将继续监视性能,以验证优化实际上是否有帮助。如果不是,它可能会不优化代码。还有可能发生的事情,无效的优化,如加载新的类。我会考虑那些事情无法预测,至少不是基于计算器的答案,但有工具告诉你的JIT是这样做的:https://github.com/AdoptOpenJDK/jitwatch
它是如何帮助,如果我有需要是对象每次收到活动时创建。
一个简单的例子可能是:您在方法内部创建对象,因为引用会离开方法的范围,这些对象将存储在堆中,并最终被垃圾收集器收集。如果使用这些对象的代码被大量使用,它可能最终以单个大方法进行内联,可能会被重新排序以至于无法识别,直到这些对象仅存在于此方法内。在那时,他们可以放在堆栈上并在方法退出时被删除。这可以节省大量垃圾回收,并且只会在一些热身之后才会发生。所有这些说法:我对一个人需要做任何特殊的热身操作这个概念持怀疑态度。只需启动你的应用程序,并使用它,JIT编译器就可以做到这一点。如果您遇到问题,那么请了解JIT在您的应用程序中所做的工作,以及如何微调该行为或如何编写应用程序以使其最有利。
我真正了解需要热身的唯一情况是基准。因为如果你忽视它,你会得到几乎保证的虚假结果。