java - OpenJDK的虚拟机可插拔吗?

标签 java jvm graalvm

以前这很容易。我们将java虚拟机作为同义词使用。

现在我们有了 Hotspot VM (Oracle JDK),OpenJDK服务器虚拟机,Eclipse OpenJ9 VM 和 Graal VM .

我有点困惑。 OpenJDK 是否具有或者是一个可以与不同虚拟机实现结合使用的运行时环境?是否有一个标准接口(interface),或者只是 OpenJDK 支持。

我要求为两个 OpenJDK 变体运行 java -version 的输出,并且 Graal VM 在每种情况下都包含 OpenJDK rintime:

> /Library/Java/JavaVirtualMachines/openjdk11-openj9/Contents/Home/bin/java -version
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.1+13)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.11.0, JRE 11 Mac OS X amd64-64-Bit Compressed References 20181020_7 (JIT enabled, AOT enabled)
OpenJ9   - 090ff9dc
OMR      - ea548a66
JCL      - f62696f378 based on jdk-11.0.1+13)

> /Library/Java/JavaVirtualMachines/openjdk11/Contents/Home/bin/java -version
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.1+13)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.1+13, mixed mode)

> /opt/graal/graalvm-ce-1.0.0-rc10/Contents/Home/bin/java -version
openjdk version "1.8.0_192"
OpenJDK Runtime Environment (build 1.8.0_192-20181024123616.buildslave.jdk8u-src-tar--b12)
GraalVM 1.0.0-rc10 (build 25.192-b12-jvmci-0.53, mixed mode)

我知道网上有很多关于这个问题的文档,但我读过的文档都没有提供有关该主题的安全知识状态。

最佳答案

OpenJDK 非常模块化,一个典型的例子是 Graal 编译器,它可以通过 JVMCI 接口(interface)插入并完全取代顶级 JIT 编译器 (C2)。 Graal 仍然使用 HotSpot 来构建久经考验的基础设施:对象模型、类加载、配置文件、调试、GC...

有一些“接口(interface)”/组件:

  • VM 接口(interface) (libjvm),一系列低级方法,例如处理 native 套接字、打开文件、创建线程...
  • native 绑定(bind) (JNI),Java 和 native 世界之间定义良好的接口(interface)。
  • Java 本身,包括标准库,实际上有大量 Java 代码是用 Java 实现的。
  • libjava,标准库中许多 native 方法的 native 实现,它完全与 VM 无关。

要实现一个新的 VM,您需要实现 VM 接口(interface)、JNI 和字节码编译器/解释器,然后您可以重用 Java + libjava 中的所有代码,而无需移植/重新实现任何内容,例如你可以免费获得所有 IO、NIO、套接字,甚至类加载器。

GraalVM 只是具有超能力的 OpenJDK,其中包括最先进的编译器 (Graal)、构建(快速)编程语言的框架 (Truffle) + AOT 优化编译器 (SubstrateVM)...以及其他好东西.

关于java - OpenJDK的虚拟机可插拔吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53806790/

相关文章:

java - 为什么 JVM 类加载器必须在第一次主动使用之前才​​报告问题?

java - Jboss 部署和 Java 堆问题

java - 如何使用 GraalVM 在现有的 grails 或 spring 应用程序中运行 javascript?

c# - 从屏幕抓取中解析文本

java - Hibernate 运行随机查询

java - 我可以在切换到 myBatis 的同时将 iBatis 和 Mybatis 保持在同一个应用程序中吗?

java - 为什么大多数 JVM gc 不使用引用计数?

java - Micronaut 和 Java Mail API

java - 如何将 Graalvm 的 Truffle 框架与 Groovy 结合使用?

java - Jasper 报告 PDF 印地文版