24

OpenJDK VM 和 Oracle Hotspot VM 仍然是两个不同的 JVM 吗?

我似乎找不到任何关于 OpenJDK VM 的官方文档。甚至在 OpenJDK 主页上也有一个开发 HotSpot VM 的 HotSpot Group。

HotSpot 小组由参与 HotSpot 虚拟机的设计、实现和维护的开发人员组成

但是,如果我在我的 Windows 机器上检查 java -version 它会打印出来

Java HotSpot(TM) 64 位服务器虚拟机

但是在我的 Ubuntu VPS 上

OpenJDK 64 位服务器虚拟机

如果这是两个不同的虚拟机,它们之间的主要区别是什么?他们有不同的运行时标志集吗?

4

2 回答 2

44

tl;博士

apangin接受的答案现在已过时。

对于 Java 11 等最新版本,Oracle JDK产品与OpenJDK项目几乎相同。OpenJDK 现在包括 Oracle 以前的产品:Java Flight RecorderJava Mission ControlApplication Class-Data SharingZGC

引用Oracle.com 博客

因此,从 Java 11 开始,Oracle JDK构建和OpenJDK构建将基本相同。

Oracle JDKOpenJDK融合

甲骨文在过去几年发生了巨大的变化。

Oracle 宣布他们打算将他们的品牌Oracle JDKOpenJDK融合到功能上。两者都基于 OpenJDK 代码库。

为此,Oracle、Flight RecorderMission Control销售的以前的商业工具现已开源并捐赠给 OpenJDK 项目。在 OpenJDK 站点上查看这个这个。

Oracle 和 OpenJDK 联盟的其他成员贡献了更多的源代码,以使 OpenJDK 代码库完全开源,并且不受 GNU GPL+链接例外之外的许可证的限制。

Oracle 已更改其许可条款。Oracle JDK品牌产品不再免费用于生产。或者,您可以从超过六家供应商中的任何一家获得 OpenJDK 的免费分发,其中包括来自 Oracle 的供应商。有关所有详细信息,请参阅由 Java 社区的支柱编写的这份重要白皮书,Java Is Still Free

我绘制了这个流程图来指导您选择 JDK 源。

指导您为 Java 11 实施选择供应商的流程图

Oracle 保留为紧急修复或安全漏洞修补其自有品牌产品的权利。但该公司已表示他们打算也与其他 OpenJDK 成员做出贡献和协调。Oracle 继续拥有 Java 商标并引领 Java 平台的未来。对于现有的长期支持 (LTS)版本 8 和 11,Oracle 已将管理权让给了 RedHat ( IBM )。

选择 Java 供应商的动机

HotSpotOpenJ9

这里的问题是:

OpenJDK VM 和 Oracle Hotspot VM 仍然是两个不同的 JVM 吗?

如上所述,这两种产品在功能上趋同。关于HotSpot技术,请继续阅读。

如上所述,HotSpot 是 Oracle JDK 和 OpenJDK 中的一个组件。今天的 HotSpot 还结合了来自JRockit的部分。Oracle 从Sun MicrosystemsBEA Systems获得了这两个 Java 引擎中最好的部分。

来自 Eclipse 基金会的Adoptium项目(以前称为 AdoptOpenJDK)还提供了一个使用Eclipse OpenJ9(基于J9,由IBM捐赠)构建的 OpenJDK,作为 HotSpot 的替代方案。从 Adoptium 网站下载时,您可以从菜单中选择HotSpotOpenJ9

目前,测试似乎表明 OpenJ9 的启动速度明显更快,同时使用的内存要少得多,但 HotSpot 可能会在持续使用的情况下运行得更快。但这对于 OpenJ9 来说仍处于早期阶段,因此请自行调查最新进展。

显示 HotSpot 和 JRockit 合并历史的图表,以及在 Adoptium 中都可用的 OpenJ9

于 2019-05-22T00:01:15.587 回答
15

Oracle HotSpot JVM 基于 OpenJDK HotSpot 项目。因此,它们大多是相同的 VM,只是 Oracle JVM 具有一些额外的商业特性,主要是Java Flight Recorder应用程序类数据共享和协同内存管理。

两个虚拟机的运行时标志几乎相同;使用查看完整列表

-XX:+UnlockDiagnosticVMOptions -XX:+UnlockCommercialFeatures -XX:+PrintFlagsFinal

从 JDK 8u131 开始,唯一的区别在于以下标志(OpenJDK VM 中不存在):

 bool EnableResourceManagementTLABCache         = true         {product}
 bool EnableSharedLookupCache                   = true         {product}
 bool FlightRecorder                            = false        {commercial}
ccstr FlightRecorderOptions                     =              {product}
 bool LogCommercialFeatures                     = false        {product}
ccstr MemoryRestriction                         = none         {commercial}
 bool ResourceManagement                        = false        {commercial}
 intx ResourceManagementSampleInterval          = -1           {commercial}
ccstr StartFlightRecording                      =              {commercial}
 bool TraceSharedLookupCache                    = false        {product}
 bool UnlockCommercialFeatures                 := true         {commercial}
 bool UseAppCDS                                 = false        {commercial}
于 2017-06-03T01:59:32.553 回答