【问题标题】:Is there a precompiler solution for JVM like NGen?是否有像 NGen 这样的 JVM 预编译器解决方案?
【发布时间】:2019-07-14 02:08:58
【问题描述】:

我最近比较了 JVM 和 CLR 平台,并讨论了 JIT 编译的影响。我的讨论导致.NET 能够使用 NGen 工具预编译代码,这将消除对 JIT 编译的需要。 Java 平台有没有等价物?

【问题讨论】:

  • 我个人不知道有什么(您可以查看诸如 launch4j、jexe 等选项,它们只是包装器,不像 NGen),我不确定它有多可行是...这个问题的答案涉及到编译为本机代码的一些细节:stackoverflow.com/questions/2506969/…

标签: java jvm jit


【解决方案1】:

我听得最多的原生编译器是 Excelsior JET——Java 虚拟机和原生编译器。有关详细信息,请参阅http://www.excelsior-usa.com/jet.html。基本上你可以把你的项目变成一个单一的可执行文件,而不需要通常的 Java 打包的麻烦。

他们已经存在了很长时间(当我在 2001 年加入 Java 行列时,他们就在这里,现在他们就在这里。我一周前刚刚听说一家公司正在使用他们的解决方案并且对此感到满意。

大约几年前,在 JavaONE,我还遇到了该产品的一两个开发人员,他们告诉我他们很活跃,而且表现不错。

【讨论】:

  • 我已经在 Excelsior JET 上进行了性能基准测试。编译后的本机代码比 Oracle JIT 生成的代码要慢得多,在我的测试中它慢了 2 倍。在 JIT 优化代码之前,它甚至更慢。
【解决方案2】:

我个人不知道(您可以查看诸如 launch4j、jexe 等选项,它们只是包装器,不像 NGen),我不确定它有多可行......这个问题的答案详细介绍了编译为本机代码的主题:Differences in JIT between Java and .Net

【讨论】:

    【解决方案3】:

    是的。从 Java 9 开始,您可以。您正在寻找的功能称为 Ahead of Time (AOT) 编译。

    目前使用的主要 JVM 有两种:

    • HotSpot(及其变体),它是 Oracle 的主要 JVM。
    • OpenJ9,最初来自 IBM。

    OpenJ9

    在 OpenJ9 中,只需使用 -Xshareclasses:persistent 选项运行 Java 虚拟机。这会导致 VM 将编译后的二进制文件存储到缓存中,该缓存会在系统启动时持续存在。它并不强制 Java VM 在所有情况下都使用预编译代码,因为在许多情况下,即时 (JIT) 代码可以更快地执行。 JVM 将根据具体情况选择是否使用缓存的二进制文件。当缓存的 AOT 方法运行时,它还可能被即时 (JIT) 编译器进一步优化。

    详情请见:

    HotSpot (OpenJDK)

    HotSpot (OpenJDK) 版本现在包含一个实验性 VM,它可以完全预编译所有内容,称为 GraalVM。您可以使用 jaotc 可执行文件手动创建本机二进制文件。 注意:这目前仅适用于 Linux(可能还有 Mac)系统。

    关于如何使用 jaotc 编译器的详细信息在:

    注意:jaotc 不像 OpenJ9 共享类标志那样简单易用。

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 2020-03-27
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 2020-05-22
      相关资源
      最近更新 更多