ChatGPT解决这个技术问题 Extra ChatGPT

Oracle JDK 和 OpenJDK 的区别

注意:这个问题来自 2014 年。从 Java 11 开始,OpenJDK 和 Oracle JDK 正在融合。

Oracle 和 OpenJDK 之间有什么关键区别吗?

例如,垃圾收集和其他 JVM 参数是否相同?

GC 在两者之间的工作方式不同吗?

如果您计划从 Oracle 迁移到 OpenJDK,这也可能是相关的,因为 Oracle 不再免费。 developers.redhat.com/blog/2018/11/05/…
找到更好的答案:stackoverflow.com/a/59041992/248847

W
Willi Mentzel

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


所以你说openjdk是所有其他jdk的基线,只是他们复制它然后在它自己的规范之后对其进行调整?
我参加聚会迟到了,但我还是会问的。 jdk 带来了什么 openjdk 没有的?所有这些答案都让 openjdk 在各个方面听起来都等于或优于它,但如果是这样的话,为什么 Oracle 还要费心维护 jdk 呢?
@Karl Morrison 据我所知,.. 每个实现 JVM 规范的人都只这样做.. 但是没有明确的规则必须遵循这种方式......
Mella OpenJDK <= OracleJDK 例如,Oracle JDK 几乎没有设置受信任的密钥,这在 OpenJDK 中没有(现在人们只是导入它们来填补这个空白) Oracle JDK 有一些 SWING 库,这些库是为加速渲染而专有的..(曾经做过服务器应用程序的人,可能与他们无关)Oracle JDK 有 Applet 插件(上述原因相同)Oracle JDK 错误修复/修补程序将由 Oracle 正确分发和处理,因为 OpenJDK 几乎没有技术可以确保所有应用补丁以及它们会有什么冲突
请注意,对于 java 的新版本模型,Oracle 计划尽可能减少两个 jdk 之间的差距。除了 oracle 开发者,还有其他开源贡献者开放 jdk 吗?这是为了了解是否有足够的支持将修复从最新版本反向移植到以前的版本。有什么想法吗?
G
Greg Dubicki

对于 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 中尚不可用),并用开源替代品替换受阻的第三方组件以实现更接近的平等代码库之间。


还有许可差异。
谢谢我找到了更好的答案。 stackoverflow.com/questions/17360011/…
在 ARM 上,至少这两者在性能上似乎有很大不同。我必须对它发生的原因进行一些分析,但主观区别是“Oracle JDK 还可以”和“OpenJDK 完全无法使用”。
@dualed 尽管如此,android 正在从 android 7 开始转向 openjdk。看起来他们正在准备重大改进。 venturebeat.com/2015/12/29/…
@JohnnyDoe 让我们希望,如果谷歌正在转向 OpenJDK,他们将为上游提供性能补丁,以便它在 Android 之外的 ARM 上也能正常运行!
T
The Gilbert Arenas Dagger

未来的一个关键区别是发布时间表和支持政策。

OpenJDK

OpenJDK 将每 6 个月发布一个功能版本,仅支持到下一个功能版本。它本质上是针对开发人员的连续发布流。

甲骨文

Oracle JDK 更多地针对重视稳定性的企业受众。它基于 OpenJDK 版本之一,但随后获得长期支持 (LTS)。 Oracle JDK 计划每 3 年发布一次。

https://i.stack.imgur.com/mmVJs.png

来源:https://www.oracle.com/java/java9-screencasts.html?bcid=5582439790001&playerType=single-social&size=events


长期版本需要您购买商业支持才能在 Java 版本发布 6 个月后获得更新。与短期发布相比,长期发布的意义何在?像 JDK 9/10 这样的短期版本是否没有 Oracle 的商业支持?
@AndyDufresne 为什么您认为仅在 6 个月后您就必须支付支持费用?我的理解是时间线待定。不过,6 个月似乎非常短……我怀疑我们能否期待 5 年的公开更新,就像 Java 8 一样,但如果公开更新 2 或 3 年,我不会感到惊讶。参考 - 这是根据:oracle.com/technetwork/java/eol-135779.html
oracle 链接提到“例如,Oracle JDK 11 (18.9 LTS) 的 LTS 版本将得到至少 5 年的支持,如 Oracle 终身支持政策中所述”。该政策有 3 个级别的支持,其中没有一个看起来是免费的。在查看 azul CTO 的评论后,我也提到了这一点 - blog.takipi.com/java-11-will-include-more-than-just-features/…。这种新发布策略的主要目标是不花时间维护旧版本。如果支持是免费的,那么模型将与现在相同。
M
Menuka Ishan

对于 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


对于 Android Studio,这不再适用:最新的 OpenJDK 副本与 Android Studio 2.2 及更高版本捆绑在一起,这是我们建议您用于 Android 项目的 JDK 版本。来源:developer.android.com/studio/intro/studio-config#jdk
“像 Minecraft 这样的软件希望使用 Oracle JDK。事实上,警告。”实际上,在 Ubuntu 中,Mojang 的官方 .deb 安装程序在安装启动器时会引入 OpenJDK。
m
mars

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 是从哪里建立的?
N
Naresh Joshi

根据甲骨文博客,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 文件的形式提供,同时正在考虑替代分发格式。


I
Istiaque Hossain

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


D
Dalibor Topic

可以在此博客文章中找到 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 构建。


我注意到您的大多数答案都带有签名。我已经把它们编辑掉了。请阅读 Are taglines & signatures disallowed?stackoverflow.com/help/behavior(特别是“不要使用签名、标语或问候”部分。)
G
Gili

除了明显的许可差异外,OpenJDK 和 OracleJDK 11 之间的主要区别在于稳定性和性能更新。

来源:https://www.youtube.com/watch?v=Adv9--6IcQI&t=385

每 6 个月,这两个代码库将同步。但在 6 个月的窗口期内,OpenJDK 只会收到安全更新,而 OracleJDK 会收到额外的稳定性和性能更新。

鉴于 OpenJDK 和 OracleJDK 仅每 3 个月发布一次更新版本,这意味着您将错过(最多)3 个月的修复,直到下一个主要版本发布并升级。但是,如果您选择坚持使用 LTS 版本,那么商业许可证开始变得更有意义。


G
Greg Dubicki

对于 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,这只是基准之一。


l
logbasex

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


n
nettie

我的理解是 Oracle JDK 不能用于生产,因此我不能合法地使用它(不付费),用于我为我的公司构建的 Web 应用程序。我必须使用 OpenJDK。如果我错了,请纠正我!从 this article

从 Java 11 开始,Oracle JDK 仅限于开发和测试环境。如果您购买了商业支持,Oracle JDK 只能用于生产。相反,Oracle 将免费提供基于 OpenJDK 的 Java 构建,可用于生产。但对于官方的 Oracle JDK,真正的路线图将如下所示:

更新:我错了。我可以免费使用 Oracle JDK,但 6 个月后将无法获得安全更新,我们将不得不承担风险。查看上面链接的文章部分“新发布列车对我的公司意味着什么?”。


从 JDK 13 开始,这可能不再适用。Oracle 表示,Oracle JDK 有一个新许可证:“新许可证允许免费使用某些用途,例如个人使用和开发使用,但其他用途根据以前的 Oracle JDK 许可证可能不再可用”。请参阅oracle.com/downloads/licenses/javase-license1.html
只是想知道,当前版本的 oracle jdk8u241 可以免费用于生产吗?
C
Cyberradar academy

非常接近 - 我们的 Oracle JDK 版本的构建过程是在 OpenJDK 7 上构建的,只添加了几部分,例如部署代码,其中包括 Oracle 的 Java 插件和 Java WebStart 实现,以及一些封闭源代码的第三方像图形光栅化器这样的组件,一些开源的第三方组件,像 Rhino,还有一些零碎的东西,比如额外的文档或第三方字体。展望未来,我们打算开源 Oracle JDK 的所有部分,除了那些我们认为商业功能的部分,如 JRockit Mission Control(Oracle JDK 中尚不可用),并用开源替代品替换受阻的第三方组件,以实现更接近的平等。代码库。

· 是的,垃圾回收和其他JVM 参数是一样的。

· GC 的性能在两者中是相同的。