当前位置: 首页 > 知识库问答 >
问题:

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

端木高卓
2023-03-14

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

我查看了解释器文档,了解到解释器会分析每个请求中的每个语句,然后将其转换为本机代码,从而降低性能。

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

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

请详细解释这一点。

共有1个答案

巴宏恺
2023-03-14

这取决于实现,但至少在Java,JIT通常是针对“热点”完成的,即经常使用的代码。因此,如果JVM发现一个方法被调用了超过X次,它会将其编译为本机代码。也就是说,你必须先调用几次,之后它只会变得更快。

此外,JIT结果通常保存在内存中,而不是保存到磁盘中,因此,该过程在下次应用程序运行时从头开始(这是及时编译和提前编译之间的一个很大区别,后者发生在程序运行之前)。

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

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

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

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

 类似资料:
  • 问题内容: 我经常碰到声称Java被解释的文章。我知道Oracle的HotSpot JRE提供即时编译,但是大多数台式机用户都是这种情况吗?例如,如果我通过http://www.java.com/en/download下载Java ,它将包括JIT编译器吗? 问题答案: 是的,一点没错。声称Java被解释的文章通常由不了解Java的工作原理或不了解解释的含义的人撰写。 话虽如此,HotSpot 有

  • 据我所知,JIT将字节码编译成运行速度更快的本机代码。因此,根据我的信念,我的问题的答案应该是1。翻译成机器代码2。解释字节码。因为解释代码意味着执行代码。但我发现答案恰恰相反!谁能解释一下。。。提前感谢

  • 我想你们大多数人都知道在Java语言中是一个保留的关键字,但实际上并没有被使用。你们可能也知道是一个Java虚拟机(JVM)操作码。我认为Java、Scala和静态编程语言的所有复杂的控制流结构都是在JVM级别上使用和、、等的某种组合来实现的。 查看JVM规范https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.

  • 在Google的Python类中 Python是一种动态的解释(字节码编译)语言 我知道什么是解释器,也知道什么是字节码,但两者加在一起似乎不合适。在阅读了一些之后,我变得更清楚了,基本上Python源代码在被解释之前是自动编译的;但是出现了一些新的问题。 使用Python解释器时,不会发生编译吗?如果有,什么时候?例如,如果您只是在命令行中键入代码,并且每次按enter键时它都会运行,那么编译器

  • 互联网上的大多数网站都说: “使用命令编译文件。然后使用命令运行它” 但是今天我试着运行一个没有javac的java程序,得到了一个奇怪的结果。 下面是名为的文件的内容: 然后我跑: 这给了我这个错误: 但是,当我在没有命令的情况下运行它时,它执行时没有任何错误。 命令是否也编译程序?如果是,为什么我们需要命令? 我的java版本是:

  • 问题内容: 我想知道如何检查JIT编译器是否已关闭。我有以下代码旨在关闭JIT编译器。问题是,我不确定它是否确实在这样做。所以我想知道是否有一种方法可以检查JIT是否关闭。我看了Compiler类,但没有类似的方法。 码: 任何帮助或指导将不胜感激。 问题答案: 我不相信您可以在运行时关闭JIT。 如果要认真地对Java程序进行基准测试,则绝对应该忽略前几次运行。在Java中获得可靠的基准测试是一