首页 文章

桌面上的JVM是否使用JIT编译?

提问于
浏览
3

我总是遇到声称Java被解释的文章 . 我知道Oracle的HotSpot JRE提供即时编译,但对于大多数桌面用户来说情况如此吗?例如,如果我通过以下方式下载Java:http://www.java.com/en/download,这是否包含JIT编译器?

5 回答

  • 10

    是的,一点没错 . 声称Java被解释的文章通常是由那些不了解Java如何工作或不理解解释意味着什么的人编写的 .

    话虽如此,HotSpot有时会解释代码 - 这是一件好事 . 肯定有任何应用程序的部分(通常在启动时)只执行一次 . 如果你能比JIT编译它更快地解释它,为什么还要花费开销呢?另一方面,我对"Java is interpreted"文章的体验是,这不是他们的意思:)

    编辑:采用T. J. Crowder的观点:是的,从java.com下载的JVM将是HotSpot . 但是HotSpot有两种不同的JIT - 服务器和桌面 . 为了总结单个句子中的差异,桌面JIT旨在快速启动应用程序,而服务器JIT则更注重高性能:服务器应用程序通常运行很长时间,所以花费大量时间来优化它们从长远来看,这是值得的 .

  • 1

    JVM规范中没有任何内容要求任何特定的执行策略 . 有些JVM只能解释,它们甚至没有编译器 . 有些JVM只有JIT编译,它们甚至没有解释器 . 一些JVM同时具有解释器和编译器(甚至多个编译器),并在启动时静态选择 . 有些同时具有动态在运行时间来回切换 . 有些甚至不是通常意义上的虚拟机,它们只是提前将JVM字节码静态编译为本机机器码 .

    您询问的特定JVM是Oracle的HotSpot JVM,它有一个解释器和两个编译器,称为C1和C2编译器,通常也称为客户端和服务器编译器,位于相应的命令行选项之后 . HotSpot在运行时动态地在解释器和其中一个编译器之间来回切换(但是它不会在两个编译器之间切换,你必须在命令行上指定其中一个,然后只有那个将用于整个运行时的JVM) .

    根据文档 here 从一些后来的Java SE 7版本开始,一个名为分层编译的新功能变得可用 . 此功能在开始时使用C1编译器模式以提供更好的启动性能 . 一旦应用程序正确预热,C2编译器模式就会接管以提供更积极的优化,并且通常会提供更好的性能

    C1编译器是一个优化编译器,速度非常快,不会占用大量内存 . C2编译器更积极地进行优化,但也更慢并且使用更多内存 .

    您可以通过指定 -client-server 命令行选项在两者之间进行选择(如果未指定,则为 -client 是默认选项),这也会设置一些其他JVM参数,如默认JIT阈值(在 -client 模式下,将编译方法在他们被解释1500次之后,在 -server 模式之后10000次,可以用 -XX:CompileThreshold 命令行参数设置) .

    “大多数桌面用户”是否实际上将以编译或解释模式运行,在很大程度上取决于它们运行的代码 . 我的猜测是,绝大多数桌面用户都是从Oracle的JRE / JDK或其中一个分支运行HotSpot JVM(例如OSX上的SoyLatte,Unix / BSD / Linux上的IcedTea或OpenJDK),并且他们没有使用命令行选项,因此他们可能会使用默认的1500 JIT阈值获得C1编译器 . (但IntelliJ,Eclipse或NetBeans等应用程序都有自己的启动程序脚本,通常提供不同的命令行参数 . )

    例如,在我的情况下,我经常运行从未实际达到JIT阈值的小脚本,因此它们永远不会被编译 . (也不应该 . )

  • 0

    关于Hotspot JVM的一些链接(您在上面的java.com下载链接中下载的内容)可能会有所帮助:

  • 19

    到目前为止,(其他 - 优秀)答案似乎都没有真正回答你的最后一个问题,所以: Yes ,您从www.java.com下载的Java运行时是Oracle 's (Sun' s)Hotspot JVM,所以是的,它将进行JIT编译 . HotSpot不仅适用于服务器或类似的东西,它还可以在桌面上运行,并充分利用其(非常成熟的)优化JIT编译器 .

  • 3

    Jvm规范从未声明如何执行java字节码,但是,如果使用来自热点VM的JVM,则可以指定JIT编译器,JIT只是一种优化字节码执行的技术 .

相关问题