【问题标题】:can a GraalVM app be deployed on a "regular" VMGraalVM 应用程序可以部署在“常规”VM 上吗
【发布时间】:2021-11-01 10:41:08
【问题描述】:

为了获得 GraalVM 提供的性能优势,必须使用 GraalVM 的编译器编译应用程序。但是,我不清楚应用程序是否也必须由 GraalVM 执行,或者是否可以将其部署到“常规”VM(例如 OpenJDK)以从改进的性能中受益?

一些可能相关的额外细节

  • 我使用的是 JDK 11
  • 有问题的应用程序仅使用 JDK 语言,例如Java、Kotlin、Groovy
  • 构建工件是一个 JAR 文件,即 GraalVM 原生映像使用

【问题讨论】:

  • 如果您不使用 GraalVM Native Image,那么您不会从更好的性能中受益。执行字节码的性能直接关系到执行字节码的VM。
  • @McPringle 我不认为你是正确的,编译器本身肯定也会影响性能吗?请参阅 GraalVM 文档 graalvm.org/why-graalvm 的“更快地运行 Java”部分
  • @Antionio Dragos:您有两种可能使用 GraalVM 更快地运行 Java 程序:首先,将其编译为本机代码(Graal Native Image)。其次,将 GraalVM 用作 VM。但是,如果您使用非 Graal-VM 运行 Java 字节码,它不会运行得更快。您提到的网站上也有说明。 :-)
  • @McPringle 那么是不是为了从 GraalVM 中受益,代码必须由 GraalVM 编译执行?
  • 如果你编译成字节码,是的。如果你编译为本机代码,没有。

标签: java graalvm


【解决方案1】:

如果您使用 JVM 运行时模式编译了代码,那么您可以在任何 JVM 上运行您的应用程序。无需强制使用 GraalVM 运行应用程序。

如果您使用 Native Image 编译器编译您的代码,那么它将创建一个本机可执行二进制文件,无需使用任何 JVM 即可直接执行。

【讨论】:

  • 我询问的具体情况是应用程序使用 GraalVM 编译,但部署为 JAR 文件。是否必须将其部署到 GraalVM 才能从 GraalVM 编译器执行的优化中受益。
  • 是的。生成字节码的编译器仅限于标准。您可以做一个非常简单的测试:使用 GraalVM 和 Java VM 将您的应用程序编译为字节码。比较字节码。您提到了一个网站作为对我评论的回答。引用:“GraalVM 可以在 OpenJDK 的上下文中运行,通过一种新的即时编译技术使 Java 应用程序运行得更快。”编译器!= 编译器。至少有三个编译器:Java 字节码编译器、即时编译器和原生映像编译器。最后两个有所不同。
【解决方案2】:

GraalVM 基于带有一些附加功能的 OpenJDK;其中之一是最先进的编译器。

Graal 编译器用途广泛;它用于编译原生镜像(AOT 模式),但也可以用作 JIT 编译器,替代 OpenJDK 中默认提供的 C2。

在这种情况下,术语编译器有点重载。传统的 Java“编译器”,例如javac/ecj,将 Java 源代码编译为字节码。 “优化编译器”例如Graal 和 C2,将字节码编译为高度优化的程序集。

GraalVM 使用不同的“优化编译器”(Graal),与普通 OpenJDK (C2) 相比,它确实可以提供一些加速,但这很大程度上取决于您的工作量,您应该始终衡量自己。

其他参考:Twitter's Quest for a Wholly Graal Runtime by Chris Thalinger

【讨论】:

    猜你喜欢
    • 2017-11-19
    • 2018-06-12
    • 2017-12-13
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多