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

时间:2013-10-07 02:48:48

标签: java jit

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

我正在阅读Interpreter doc并理解解释器会在每个请求中分析每个语句,然后转换为本机代码,从而导致性能降低。

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

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

请详细解释。

1 个答案:

答案 0 :(得分:2)

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

此外,JIT结果通常为kept in-memory, not saved to disk,因此下次应用程序运行时,该过程将从头开始(即即时编译和Ahead-of-Time编译之间的巨大差异,后者在程序运行之前发生。)

  

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

好吧,你只需要一次等待编译的性能命中。之后,它正在为该方法执行已编译的本机代码,在此之前它正在解释字节码。如果JVM猜测这个方法是一个热点是正确的,它应该随着时间的推移而得到回报。

  

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

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