java - 即使使用 JIT 编译器,对 Java 应用程序的第一个请求是否总是很慢?

标签 java jit

我对编译和解释以及 JIT 的工作方式有些困惑。 我知道源代码或 Java 程序被编译为 Java 字节代码,然后加载到 JVM,然后 JVM 将字节码解释为 native 机器代码或使用 JIT。

我正在阅读解释器文档,并了解到解释器会分析每个请求的每个语句,然后转换为 native 代码,从而导致性能下降。

还了解到 JIT 进行动态翻译并将 native 代码存储在缓存中,然后用于后续请求。

我想了解的是 JIT 到底是如何工作的?每当向应用程序发出第一个请求时,它就会将该部分字节代码转换为机器代码,存储在缓存中并使用它。这是这个过程吗?如果是这样,那么每个第一个请求是否总是较慢,因为它需要将字节码转换为机器代码?

请详细解释一下。

最佳答案

取决于实现,但至少在 Java 中,JIT 通常是针对“热点”(即频繁使用的代码)进行的。因此,如果 JVM 发现某个方法被调用超过 X 次,它会将其编译为 native 代码。这意味着,您必须先调用它几次,之后它只会变得更快。

此外,JIT 结果通常为 kept in-memory, not saved to disk ,以便该过程在应用程序下次运行时从头开始(这是即时编译和提前编译之间的很大区别,后者发生在程序运行之前)。

understood that an Interpreter analyses each statement on every request and then converts to native code leading to slower performance.

好吧,您会因为等待编译发生一次而遭受性能损失。之后,它执行该方法的已编译 native 代码,在此之前,它解释字节码。如果 JVM 对该方法作为热点的猜测是正确的,那么随着时间的推移,它应该会得到返回。

Is the first request to a Java Application always slow even with JIT Compiler?

如果有的话,JIT 编译器的存在会使第一个(或几个早期)请求变慢,因为它增加了额外的工作。但是,后续请求应该比非 JIT 执行环境快得多。

关于java - 即使使用 JIT 编译器,对 Java 应用程序的第一个请求是否总是很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19216379/

相关文章:

java - 如何将失败的 Cucumber 步骤的屏幕截图准确地附加到 Allure 报告中,而不是在“Tear Down”部分中?

java - 拥有大量小方法是否有助于 JIT 编译器优化?

gcc - LLVM 与 InitializeNativeTarget 的问题

c# - 获取 C# 程序的已编译 asm

c# - 如何在没有JIT的情况下运行程序?

java - 获取多行文本字段中的光标位置

java - 尝试连接到 RDS 时 AWS EC2 间歇性 UnknownHostException

java - 将java类数据转成JSON格式?

java - 使用 Java ProcessBuilder : Why does hGetLine only return when I close outputStream? 运行 haskell 可执行文件

python - Numba - jitclass 实例的副本