使用 OpenJDK 时默认运行哪个 JVM?

Which JVM runs by default when you are using OpenJDK?

我必须在我们的应用程序中进行一些性能调整 API,并且我一直在研究 JVM 标志 关于堆大小和 Gargabe 收集。然而,我经常发现自己在许多不同的文档中,有时我最终会在 WebLogic Servers 文档或 java 生态系统的其他企业版本中。

我考虑过所有 JVM 通用的测试标志,我读过其中一些更常见并且几乎存在于所有 JVM 中,而有些则更具体,例如 -XX JVM 特定。

我的猜测是 https://openjdk.java.net/groups/hotspot/ 就是答案,但我想知道是否有人有更具体的信息。我在家里有 运行 一个命令(不是我工作中的应用程序,但结果似乎是一样的,除了 java 版本)在家里在一个过程中获取一些信息,只是比较:

root@xxxx:/home/xxxx# jcmd 6134 VM.system_properties > log.out
root@xxxx:/home/xxxx# cat log.out | grep vm
java.vm.vendor=Ubuntu
java.vm.specification.version=11
sun.boot.library.path=/usr/lib/jvm/java-11-openjdk-amd64/lib
java.home=/usr/lib/jvm/java-11-openjdk-amd64
java.vm.compressedOopsMode=Zero based
java.vm.specification.vendor=Oracle Corporation
java.vm.name=OpenJDK 64-Bit Server VM
java.vm.specification.name=Java Virtual Machine Specification
java.vm.info=mixed mode, sharing
java.vm.version=11.0.11+9-Ubuntu-0ubuntu2.18.04
root@xxxx:/home/xxx# 

如您所见,它只是声明 OpenJDK 64 位服务器 VM 作为 jvm 名称。如果我尝试在 google 上搜索标志,它会返回到 HotSpot,因此我怀疑。

我已经使用列出所有 JVM 标志的命令来查看选项,所以这已经是一件好事。然而,官方文档也很好,我一直在研究不同的 JVM 规范,希望标志的含义相同,但它确实让我觉得我不知道自己在做什么。

所以,也许 TL:DR:OpenJDK 64 位服务器 VM 可以解释为 HotSpot JVM,还是我应该在其他地方寻找它的文档?

tl;博士

JDKs 带有不同的 JVM 实现(HotSpot、OpenJ9、GraalVM),以及具有不同调整选项(Z Garbage Collector (ZGC), Garbage-First (G1), Shenandoah, Concurrent Mark Sweep (CMS), Serial Collector, Parallel Collector 等)的各种垃圾收集器实现

HotSpot & OpenJ9

通用 Java 工作有两个 JVM 实现:

这两个 JVM 都非常出色并且经过充分验证。至于比较,评论员经常提到 OpenJ9 启动速度更快,初始内存需求更少,而随着时间的推移,HotSpot 可能更适合执行。但是做你自己的研究来选择。请记住,您在这里比较的是同类,而不是 apples and oranges

许多 JDK 发行版可从多个供应商获得,包括 Azul Systems、Red Hat/IBM、SAP、Microsoft、Oracle、Pivo​​tal、BellSoft、Amazon 等。一些供应商使用 HotSpot,一些使用 OpenJ9。有些两者都提供,让您可以选择。例如,这是来自 AdoptOpenJDK a.k.a 的屏幕截图。 Adoptium,提供 HotSpot 或 OpenJ9 的选择。

至于如何在运行时识别哪个正在使用,我无能为力。

打开JDK 项目

顺便了解下OpenJDK project covers many subprojects. HotSpot is only one of several subproject. An implementation of the core libraries we’ve come to know as the Java API is another subproject. Others subprojects are preparing technologies, such as Project Panama and Project Loom.

提供 JDK build/installer 的供应商可以自由挑选这些部件。供应商可以选择结合使用 OpenJDK 的子项目中的核心库以及来自 Eclipse Foundation 的 OpenJ9 JVM。

同时了解 OpenJDK 项目仅提供 JDK 这些部分的原始源代码。 OpenJDK 项目 而不是 提供 builds/installers。查看上面提到的其他供应商以获得 builds/installers.

Oracle 限制访问其商标“Java”的名称和徽标。相比之下,Oracle 提供了对术语“OpenJDK”的轻松访问,用于命名基于 OpenJDK 代码库的构建和安装程序。许多供应商发布的 JDK 产品名称中都有“OpenJDK”,但这意味着它们基于 OpenJDK 代码库,而不是 build/installer 由 OpenJDK 项目提供——一个微妙但重要的区别。

GraalVM

如今另一个独立的 JVM 是 GraalVM。这个 JVM 很特别。功能包括:

chriswhocodes.com 上有许多 JVM 的非常全面的选项列表。例如,Hotspot 涵盖了版本 6 到 18。对于那些小动物来说,这是一个非常好的一站式站点。