代码之家  ›  专栏  ›  技术社区  ›  Chinmay Kanchi

为什么JVM不缓存JIT编译的代码?

  •  102
  • Chinmay Kanchi  · 技术社区  · 15 年前

    目前,每次执行程序时,JIT编译器都会重新启动,而不是使用预编译版本的代码。当字节码基本上被解释时,添加这个特性不会显著提高程序的初始运行时间吗?

    5 回复  |  直到 7 年前
        1
  •  29
  •   skaffman    15 年前

    因此,您需要一种机制来确定保存的优化是否仍然是最优的,在这一点上,您不妨动态地重新优化。

        2
  •  30
  •   Alex Martelli    15 年前

    Oracle's JVM 确实有这样的记录引用甲骨文,

    编译器可以利用 可选地持久化编译Java 跨数据库调用的方法, 会话或实例。这样的 跨应用程序进行不必要的重新编译 会话或实例,如果它是 没有改变。

    我不知道为什么所有复杂的VM实现都不提供类似的选项。

        3
  •  18
  •   alex    8 年前

    => JEP 145: Cache Compiled Code New link .

    在一个非常高的水平上,它说 目标是

    保存并重用以前运行中编译的本机代码,以便

        4
  •  8
  •   Dmitry Leskov    15 年前
        5
  •  1
  •   JaakkoK    15 年前

    我不知道实际的原因,没有以任何方式参与JVM实现,但我可以想出一些合理的原因:

    • Java的思想是成为一种只写一次就可以在任何地方运行的语言,而将预编译的内容放入类文件有点违反了这一点(只有“某种程度”,因为实际的字节码仍然存在)
    • 它会增加类文件的大小,因为你会在同一个代码上多次,特别是如果你碰巧在多个不同的JVM下运行同一个程序(当你认为不同的版本是不同的JVM时,这是不是很少见的,你真的必须这么做)。
    • 类文件本身可能是不可写的(尽管这很容易检查)
    • JVM优化部分基于运行时信息,而在其他运行中,它们可能并不适用(尽管它们仍应提供一些好处)

    但我真的在猜测,正如你们所看到的,我真的不认为我的任何理由是真正的节目停顿。我想Sun只是不认为这个支持是一个优先事项,也许我的第一个原因是接近事实,因为这样做习惯性地也可能导致人们认为java类文件确实需要一个单独版本的每个VM而不是跨平台。

    我更喜欢的方法实际上是有一个单独的字节码到本机转换器,您可以使用它来预先显式地执行类似的操作,创建为特定VM显式构建的类文件,其中可能包含原始字节码,以便您也可以使用不同的VM运行。但这可能来自我的经验:我大部分时间都在做JavaMe,Java编译器在编译方面不够聪明,这让我感到非常痛苦。