注意:这个问题来自 2014 年。从 Java 11 开始,OpenJDK 和 Oracle JDK 正在融合。
Oracle 和 OpenJDK 之间有什么关键区别吗?
例如,垃圾收集和其他 JVM 参数是否相同?
GC 在两者之间的工作方式不同吗?
OpenJDK 和 Oracle JDK 目前仅由 Oracle 创建和维护。
OpenJDK 和 Oracle JDK 是通过 TCK(Java 技术认证工具包)的同一 Java 规范的实现。
大多数 JDK 供应商都是在 OpenJDK 之上编写的,通过对 [主要是替换许可的专有部件/替换为仅适用于特定操作系统的更高性能的项目] 组件进行一些调整,而不会破坏 TCK 兼容性。
许多供应商实现了 Java 规范并通过了 TCK。例如,IBM J9、Azul Zulu、Azul Zing 和 Oracle JDK。
几乎所有现有的 JDK 都是从 OpenJDK 派生的。
正如许多人所建议的那样,许可是 JDK 之间的变化。
从 JDK 11 开始,访问长期支持 Oracle JDK/Java SE 现在需要商业许可证。您现在应该注意您正在安装的 JDK,因为没有订阅的 Oracle JDK 可能会停止工作。 source
参考:List of Java virtual machines
对于 Java 7,没有什么重要的。 OpenJDK 项目主要基于 Sun 捐赠的 HotSpot 源代码。
此外,OpenJDK 被选为 reference implementation for Java 7,由 Oracle 工程师维护。
2012 年在 difference between JVM, JDK, JRE & OpenJDK 上有更详细的答案,链接到 an Oracle blog post:
问:在 OpenJDK 存储库中找到的源代码与您用于构建 Oracle JDK 的代码有什么区别?答:非常接近 - 我们的 Oracle JDK 版本的构建过程是在 OpenJDK 7 上构建的,只添加了几部分,例如部署代码,其中包括 Oracle 对 Java 插件和 Java WebStart 的实现,以及一些封闭源代码的第三方第三方组件,例如图形光栅化器,一些开源第三方组件,例如 Rhino,以及一些零碎的东西,例如附加文档或第三方字体。展望未来,我们的目标是开源 Oracle JDK 的所有部分,除了那些我们认为商业功能的部分,例如 JRockit Mission Control(Oracle JDK 中尚不可用),并用开源替代品替换受阻的第三方组件以实现更接近的平等代码库之间。
未来的一个关键区别是发布时间表和支持政策。
OpenJDK
OpenJDK 将每 6 个月发布一个功能版本,仅支持到下一个功能版本。它本质上是针对开发人员的连续发布流。
甲骨文
Oracle JDK 更多地针对重视稳定性的企业受众。它基于 OpenJDK 版本之一,但随后获得长期支持 (LTS)。 Oracle JDK 计划每 3 年发布一次。
https://i.stack.imgur.com/mmVJs.png
对于 Java 8,Oracle JDK 与 OpenJDK 的主要区别:
OpenJDK 是由 Oracle 和开放 Java 社区贡献的 Java 标准版平台的开源实现。
OpenJDK 在许可 GPL v2 下发布,其中 Oracle JDK 根据 Oracle 二进制代码许可协议获得许可。
实际上,Oracle JDK 的构建过程是从 OpenJDK 源代码构建的。所以 Oracle JDK 和 OpenJDK 之间没有重大的技术差异。除了基本代码之外,Oracle JDK 还包括 Oracle 对 Java Plugin 和 Java WebStart 的实现。它还分别包括第三方闭源和开源组件,如图形光栅化器和 Rhino。 OpenJDK Font Renderer 和 Oracle JDK Flight Recorder 是 Oracle JDK 和 OpenJDK 之间明显的主要区别。
Rockit 是 Oracle 的 JVM,从 Java SE 7 开始,HotSpot 和 JRockit 合并为一个 JVM。所以现在我们只有合并的 HotSpot JVM 可用。
在某些情况下,人们声称他们在运行 OpenJDK 时遇到了问题,而在切换到 Oracle JDK 时问题得到了解决。
Twitter 有自己的 JDK。
像 Minecraft 这样的软件需要使用 Oracle JDK。事实上,警告。
有关差异的完整列表,请参阅源文章:Oracle JDK vs OpenJDK and Java JDK Development Process
Oracle 和 OpenJDK JVM 是相同的,并且具有相同的 GC 功能(截至最新版本 10+)。在 Oracle 管理 OpenJDK JVM 之前,存在一些具体差异,使得旧的 Openjdk JVM 在许多环境中几乎无法使用。 JVM 现在是相同的。
包含作为套件一部分的 JVM 的 JDK 在许可、发布和维护计划以及 JDK 中包含的软件库方面有所不同。对我来说至关重要的差异也意味着如果不存在代码会使代码无法运行的事情。不仅是许可。
diff --brief -r openjdk oraclejdk
至关重要的是,除了 linux JDK 上的许多其他文件之外,还缺少以下文件(因此,如果您在使用 javafx 时“声称”该代码在 OpenJDK 上不起作用并且在 OracleJDK 上如此,那么您是正确的):
Only in jdk-10.0.1/bin: javapackager
Only in jdk-10.0.1/bin: javaws
Only in jdk-10.0.1/bin: jcontrol
Only in jdk-10.0.1/bin: jmc
Only in jdk-10.0.1/bin: jweblauncher
Only in jdk-10.0.1/lib: ant-javafx.jar
Only in jdk-10.0.1/lib: deploy
Only in jdk-10.0.1/lib: deploy.jar
Only in jdk-10.0.1/lib: desktop
Only in jdk-10.0.1/lib: fontconfig.bfc
Only in jdk-10.0.1/lib: fontconfig.properties.src
Only in jdk-10.0.1/lib: fontconfig.RedHat.6.bfc
Only in jdk-10.0.1/lib: fontconfig.RedHat.6.properties.src
Only in jdk-10.0.1/lib: fontconfig.SuSE.11.bfc
Only in jdk-10.0.1/lib: fontconfig.SuSE.11.properties.src
Only in jdk-10.0.1/lib: fonts
Only in jdk-10.0.1/lib: javafx.properties
Only in jdk-10.0.1/lib: javafx-swt.jar
Only in jdk-10.0.1/lib: java.jnlp.jar
Only in jdk-10.0.1/lib: javaws.jar
Only in jdk-10.0.1/lib: jdk.deploy.jar
Only in jdk-10.0.1/lib: jdk.javaws.jar
Only in jdk-10.0.1/lib: jdk.plugin.jar
Only in jdk-10.0.1/lib: jfr
Only in jdk-10.0.1/lib: libavplugin-53.so
Only in jdk-10.0.1/lib: libavplugin-54.so
Only in jdk-10.0.1/lib: libavplugin-55.so
Only in jdk-10.0.1/lib: libavplugin-56.so
Only in jdk-10.0.1/lib: libavplugin-57.so
Only in jdk-10.0.1/lib: libavplugin-ffmpeg-56.so
Only in jdk-10.0.1/lib: libavplugin-ffmpeg-57.so
Only in jdk-10.0.1/lib: libbci.so
Only in jdk-10.0.1/lib: libcmm.so
Only in jdk-10.0.1/lib: libdecora_sse.so
Only in jdk-10.0.1/lib: libdeploy.so
Only in jdk-10.0.1/lib: libfxplugins.so
Only in jdk-10.0.1/lib: libglassgtk2.so
Only in jdk-10.0.1/lib: libglassgtk3.so
Only in jdk-10.0.1/lib: libglass.so
Only in jdk-10.0.1/lib: libgstreamer-lite.so
Only in jdk-10.0.1/lib: libjavafx_font_freetype.so
Only in jdk-10.0.1/lib: libjavafx_font_pango.so
Only in jdk-10.0.1/lib: libjavafx_font.so
Only in jdk-10.0.1/lib: libjavafx_iio.so
Only in jdk-10.0.1/lib: libjfxmedia.so
Only in jdk-10.0.1/lib: libjfxwebkit.so
Only in jdk-10.0.1/lib: libnpjp2.so
Only in jdk-10.0.1/lib: libprism_common.so
Only in jdk-10.0.1/lib: libprism_es2.so
Only in jdk-10.0.1/lib: libprism_sw.so
Only in jdk-10.0.1/lib: librm.so
Only in jdk-10.0.1/lib: libt2k.so
Only in jdk-10.0.1/lib: locale
Only in jdk-10.0.1/lib: missioncontrol
Only in jdk-10.0.1/lib: oblique-fonts
Only in jdk-10.0.1/lib: plugin.jar
Only in jdk-10.0.1/lib: plugin-legacy.jar
Only in jdk-10.0.1/lib/security: blacklist
Only in jdk-10.0.1/lib/security: public_suffix_list.dat
Only in jdk-10.0.1/lib/security: trusted.libraries
Only in openjdk-10.0.1: man`
diff
是从哪里建立的?
根据甲骨文博客,Oracle JDK Releases for Java 11 and Later
从 Java 11 开始,Oracle 将在开源 GNU General Public License v2, with the Classpath Exception (GPLv2+CPE) 下提供 JDK 版本,并为那些将 Oracle JDK 用作 Oracle 产品或服务的一部分或不希望使用开源软件的人提供商业许可。这种使用开源许可证和商业许可证的组合取代了历史上的“BCL”许可证,后者结合了免费和付费商业条款。
将为每个许可证提供不同的版本,但除了一些外观和包装差异外,这些版本在功能上是相同的,下面将详细描述。
从 BCL 到 GPL
十多年来,Binary Code License for Oracle Java SE technologies (“BCL”) 一直是 Oracle Java SE 技术的主要许可。 BCL 允许在某些条件下免费使用。为了简化未来的工作,Oracle 从 Java 9 开始 providing open source licensed OpenJDK builds,使用与 Linux 平台相同的许可模型。如果您习惯于免费获取 Oracle Java SE 二进制文件,则可以继续使用 jdk.java.net 上提供的 Oracle 的 OpenJDK 构建。如果您习惯于将 Oracle Java SE 二进制文件作为商业产品或服务的一部分从 Oracle 获取,那么您可以继续通过 My Oracle Support (MOS) 和其他位置获取 Oracle JDK 版本。
功能相同且可互换...
Oracle 的 BCL 许可 JDK 历史上包含 OpenJDK 构建中不可用的“商业功能”。 As promised 但是,在过去一年中,Oracle 为 OpenJDK 社区贡献了这些功能,包括:
Java飞行记录器,
Java任务控制,
应用程序类-数据共享,以及
中关村。
因此,从 Java 11 开始,Oracle JDK 构建和 OpenJDK builds 将基本相同。
...但有一些外观和包装差异
确实仍然存在少量差异,有些是有意的和装饰性的,有些只是因为需要更多时间与 OpenJDK 贡献者讨论。
Oracle JDK 11 在使用 -XX:+UnlockCommercialFeatures 选项时会发出警告,而在 OpenJDK 构建中,此选项会导致错误。这个选项从来都不是 OpenJDK 的一部分,现在添加它没有意义,因为 OpenJDK 中没有商业功能。保留此差异是为了使 Oracle JDK 10 及更早版本的用户更容易迁移到 Oracle JDK 11 及更高版本。
Oracle JDK 11 可以配置为向“高级管理控制台”工具提供使用日志数据,该工具是一个单独的商业 Oracle 产品。我们将与其他 OpenJDK 贡献者合作,讨论这些使用数据在未来版本的 OpenJDK 中如何有用(如果有的话)。在做出此类决定之前,这种差异主要是为了向 Oracle 客户提供一致的体验。
javac --release 命令对 Java 9 和 Java 10 目标的行为不同,因为在这些版本中,Oracle JDK 包含一些不属于相应 OpenJDK 版本的附加模块: javafx.base javafx.controls javafx.fxml javafx.graphics javafx .media javafx.web java.jnlp jdk.jfr jdk.management.cmm jdk.management.jfr jdk.management.resource jdk.packager.services jdk.snmp
javafx.base
javafx.controls
javafx.fxml
javafx.graphics
javafx媒体
javafx.web
java.jnlp
jdk.jfr
jdk管理.cmm
jdk管理.jfr
jdk.management.resource
jdk.packager.services
jdk.snmp
这种差异仍然存在,以便为特定类型的遗留使用提供一致的体验。这些模块要么现在作为 OpenJFX 的一部分单独提供,要么现在在 OpenJDK 和 Oracle JDK 中,因为它们是 Oracle 为 OpenJDK 贡献的商业功能(例如,Flight Recorder),或者从 Oracle JDK 11 中删除(例如, JNLP)。
java --version 和 java -fullversion 命令的输出将区分 Oracle JDK 构建和 OpenJDK 构建,以便支持团队可以诊断任何可能存在的问题。具体来说,使用 Oracle JDK 11 构建运行 java --version 会导致:
爪哇 11 2018-09-25
Java(TM) SE 运行时环境 18.9 (build 11+28)
Java HotSpot(TM) 64 位服务器 VM 18.9(构建 11+28,混合模式)
对于 OpenJDK 11 构建:
openjdk 版本“11” 2018-09-25
OpenJDK 运行时环境 18.9(内部版本 11+28)
OpenJDK 64 位服务器 VM 18.9(内部版本 11+28,混合模式)
Oracle JDK 一直要求第三方加密提供程序由已知证书签名。 OpenJDK 中的加密框架具有开放的加密接口,这意味着它不限制可以使用哪些提供程序。 Oracle JDK 11 将继续需要有效签名,Oracle OpenJDK 构建将继续允许使用有效签名或未签名的第三方加密提供程序。
Oracle JDK 11 将继续包括安装程序、品牌和 JRE 打包,以提供与传统桌面使用一致的体验。 Oracle OpenJDK 构建目前以 zip 和 tar.gz 文件的形式提供,同时正在考虑替代分发格式。
Oracle 将每三年发布一次,而 OpenJDK 每六个月发布一次。 Oracle 为其版本提供长期支持。另一方面,OpenJDK 仅在下一个版本发布之前支持对版本的更改。 Oracle JDK 是根据 Oracle 二进制代码许可协议获得许可的,而 OpenJDK 具有 GNU 通用公共许可证 (GNU GPL) 第 2 版,但有一个链接例外。 Oracle 产品具有 Flight Recorder、Java Mission Control 和 Application Class-Data Sharing 功能,而 OpenJDK 具有 Font Renderer 功能。此外,Oracle 具有更多的垃圾收集选项和更好的渲染器,Oracle JDK 完全由 Oracle Corporation 开发,而 OpenJDK 是由 Oracle、OpenJDK 和 Java 社区开发。但是,Red Hat、Azul Systems、IBM、Apple Inc.、SAP AG 等一流公司也积极参与了其发展。
从 Java 11 转向大变革
甲骨文将结合开源和商业许可证更改其历史上的“BCL”许可证
Oracle 的 Java 11 工具包在使用 -XX:+UnlockCommercialFeatures 选项时会发出警告,而在 OpenJDK 构建中,此选项会导致错误
Oracle JDK 提供了一种配置来向“高级管理控制台”工具提供使用日志数据
Oracle 一直要求第三方加密提供者必须由已知证书签名,而 OpenJDK 中的加密框架具有开放的加密接口,这意味着可以使用哪些提供者没有限制
Oracle JDK 11 将继续包括安装程序、品牌和 JRE 打包,而 OpenJDK 构建目前以 zip 和 tar.gz 文件的形式提供
由于 Oracle 版本中存在一些附加模块,javac –release 命令对 Java 9 和 Java 10 目标的行为不同
java –version 和 java -fullversion 命令的输出将 Oracle 的构建与 OpenJDK 的构建区分开来
更新:2019 年 8 月 25 日
https://i.stack.imgur.com/nLJUc.jpg
了解更多详情oracle-vs-openjdk
可以在此博客文章中找到 Oracle JDK 11 和 OpenJDK 11 之间剩余的少数外观和包装差异的列表:
https://blogs.oracle.com/java-platform-group/oracle-jdk-releases-for-java-11-and-later
简而言之:
Oracle JDK 11 在使用 -XX:+UnlockCommercialFeatures 选项时发出警告,
它可以配置为向“高级管理控制台”工具提供使用日志数据,
它一直要求第三方加密提供商由已知证书签名,
它将继续包括安装程序、品牌和 JRE 包装,
而 javac --release 命令对于 Java 9 和 Java 10 目标的行为略有不同,并且
java --version 和 java -fullversion 命令的输出将区分 Oracle JDK 构建和 OpenJDK 构建。
除了明显的许可差异外,OpenJDK 和 OracleJDK 11 之间的主要区别在于稳定性和性能更新。
来源:https://www.youtube.com/watch?v=Adv9--6IcQI&t=385
每 6 个月,这两个代码库将同步。但在 6 个月的窗口期内,OpenJDK 只会收到安全更新,而 OracleJDK 会收到额外的稳定性和性能更新。
鉴于 OpenJDK 和 OracleJDK 仅每 3 个月发布一次更新版本,这意味着您将错过(最多)3 个月的修复,直到下一个主要版本发布并升级。但是,如果您选择坚持使用 LTS 版本,那么商业许可证开始变得更有意义。
对于 Java 8,还有一个 interesting performance benchmark for reactive (non-blocking) Spring Boot REST application being hosted on various JVMs by AMIS Technology Blog has been published in Nov 2018 表明,除其他差异外:
OpenJDK 比 OracleJDK 具有更高的 CPU 使用率,
OpenJDK 的响应时间比 OracleJDK 略低,
OpenJDK 比 OracleJDK 具有更高的内存使用率,
有关详细信息,请参阅源文章。
当然是 YMMV,这只是基准之一。
OpenJDK
OpenJDK 是开源代码,由 Oracle 维护和开发,但允许社区和其他公司参与此开发,例如 Red Hat、Azul Systems、IBM、Apple Inc 等。OpenJDK 既是 JDK 产品,也是规范,任何想要使用 OpenJDK 创建新变体的公司或组织都必须遵守这些规范。 OpenJDK 由 Oracle 和社区贡献开发。我们有时会遇到稳定性问题;但是,根据用户反馈,它将进行升级以更好地执行。 OpenJDK 定期更新,大约每 6 个月更新一次。
甲骨文
Oracle JDK 由 Oracle 维护和开发。它符合 OpenJDK 规范,但不是开源代码。 Oracle JDK 在 JVM 响应能力和生产力方面要好得多。由于其对企业客户的重要性,它更注重稳定性。
来源:https://o7planning.org/12571/history-of-java-and-the-difference-between-oracle-jdk-and-openjdk
我的理解是 Oracle JDK 不能用于生产,因此我不能合法地使用它(不付费),用于我为我的公司构建的 Web 应用程序。我必须使用 OpenJDK。如果我错了,请纠正我!从 this article。
从 Java 11 开始,Oracle JDK 仅限于开发和测试环境。如果您购买了商业支持,Oracle JDK 只能用于生产。相反,Oracle 将免费提供基于 OpenJDK 的 Java 构建,可用于生产。但对于官方的 Oracle JDK,真正的路线图将如下所示:
更新:我错了。我可以免费使用 Oracle JDK,但 6 个月后将无法获得安全更新,我们将不得不承担风险。查看上面链接的文章部分“新发布列车对我的公司意味着什么?”。
非常接近 - 我们的 Oracle JDK 版本的构建过程是在 OpenJDK 7 上构建的,只添加了几部分,例如部署代码,其中包括 Oracle 的 Java 插件和 Java WebStart 实现,以及一些封闭源代码的第三方像图形光栅化器这样的组件,一些开源的第三方组件,像 Rhino,还有一些零碎的东西,比如额外的文档或第三方字体。展望未来,我们打算开源 Oracle JDK 的所有部分,除了那些我们认为商业功能的部分,如 JRockit Mission Control(Oracle JDK 中尚不可用),并用开源替代品替换受阻的第三方组件,以实现更接近的平等。代码库。
· 是的,垃圾回收和其他JVM 参数是一样的。
· GC 的性能在两者中是相同的。
不定期副业成功案例分享