1

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

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

并且还读到 JIT 进行动态翻译并将本机代码存储在缓存中,然后用于后续请求。

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

请详细说明这一点。

4

1 回答 1

2

取决于实现,但至少在 Java 中,JIT 通常用于“热点”,即经常使用的代码。因此,如果 JVM 发现某个方法已被调用超过 X 次,它会将其编译为本机代码。意思是,你必须先调用它几次,然后它只会变得更快。

此外,JIT 结果通常保存在内存中,而不是保存到磁盘中,以便在应用程序下一次运行时进程从头开始(这是 Just-in-Time 和 Ahead-of-Time 编译之间的一个很大区别,后者发生在程序运行之前)。

理解解释器会分析每个请求的每个语句,然后转换为本机代码,从而导致性能下降。

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

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

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

于 2013-10-07T02:52:01.307 回答