2

在以前的时代,这很容易。我们使用了java虚拟机这两个词的同义词。

现在我们有了 Hotspot VM (Oracle JDK)、OpenJDK Server VM、Eclipse OpenJ9 VM 和Graal VM

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

我要求作为java -version两个 OpenJDK 变体的运行输出,并且 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)

我知道网上有很多关于这个问题的文件,但我读过的这些文件都没有给出关于这个主题的安全知识状态。

4

1 回答 1

4

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

有一些“接口”/组件:

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

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

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

于 2018-12-18T19:30:46.367 回答