我对编译和解释以及 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/