【问题标题】:Differences between Oracle JDK and OpenJDKOracle JDK 和 OpenJDK 的区别
【发布时间】:2014-04-16 23:22:50
【问题描述】:

注意:这个问题来自 2014 年。截至 Java 11 OpenJDK 和 Oracle JDK 正在收敛。

Oracle 和 OpenJDK 之间有什么重要的区别吗?

比如垃圾回收和其他JVM参数一样吗?

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

【问题讨论】:

标签: java difference


【解决方案1】:

OpenJDK

  • OpenJDK 是开源代码,由 Oracle 维护和开发,但允许社区和其他公司参与此开发,例如 Red Hat、Azul Systems、IBM、Apple Inc 等。OpenJDK 既是 JDK 产品和规范一样,任何想要使用 OpenJDK 创建新变体的公司或组织都必须遵守这些规范。 OpenJDK 由 Oracle 和社区贡献开发。我们有时会遇到稳定性问题;但是,根据用户反馈,它将进行升级以更好地执行。 OpenJDK 会定期更新,大约每 6 个月一次。

Oracle JDK

  • Oracle JDK 由 Oracle 维护和开发。它符合 OpenJDK 规范,但不是开源代码。 Oracle JDK 在 JVM 响应能力和生产力方面要好得多。由于对企业客户的重要性,它更注重稳定性。

来源:https://o7planning.org/12571/history-of-java-and-the-difference-between-oracle-jdk-and-openjdk

【讨论】:

    【解决方案2】:

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

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

    · GC 的性能是一样的。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 这可能不再适用于 JDK 13。根据 Oracle 的说法,Oracle JDK 有一个新的许可证:“新的许可证允许某些用途,例如个人使用和开发使用,不成本——但之前的 Oracle JDK 许可授权的其他用途可能不再可用”。见oracle.com/downloads/licenses/javase-license1.html
      • 只是想知道,当前版本的 oracle jdk8u241 可以免费用于生产?
      【解决方案4】:
      1. Oracle 将每三年发布一次,而 OpenJDK 每六个月发布一次。
      2. Oracle 为其版本提供长期支持。在另一 手,OpenJDK 仅支持对发布的更改,直到下一个 版本已发布。
      3. Oracle JDK 根据 Oracle 二进制代码许可协议获得许可, 而 OpenJDK 具有 GNU 通用公共许可证 (GNU GPL) 版本 2 有一个链接异常。
      4. Oracle 产品具有 Flight Recorder、Java Mission Control 和 应用程序类-数据共享功能,而 OpenJDK 有字体 渲染器功能。此外,Oracle 有更多垃圾收集选项 和更好的渲染器,
      5. Oracle JDK 完全由 Oracle Corporation 开发,而 OpenJDK 由 Oracle、OpenJDK 和 Java 社区开发。 然而,像 Red Hat、Azul Systems、IBM、 Apple Inc.、SAP AG 也积极参与其开发。

      从 Java 11 转向大变革

      Oracle 将结合开源和商业许可证更改其历史“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 日



      更多详情oracle-vs-openjdk

      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:

        对于 Java 8,Oracle JDK 与 OpenJDK 的主要区别:

        • OpenJDK 是 Java 标准版平台的开源实现,由 Oracle 和开放 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。
        【解决方案7】:

        根据甲骨文博客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 二进制文件,您可以继续使用 Oracle 的 OpenJDK 构建版本,网址为 jdk.java.net。如果您习惯于将 Oracle Java SE 二进制文件作为商业产品或服务的一部分从 Oracle 获取,那么您可以继续通过My Oracle Support (MOS) 和其他位置获取 Oracle JDK 版本。

        功能相同且可互换...

        Oracle 的 BCL 许可 JDK 历史上包含 OpenJDK 构建中不可用的“商业功能”。 As promised 然而,在过去一年中,Oracle 为 OpenJDK 社区贡献了这些功能,包括:

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

        ...但在外观和包装方面存在一些差异

        确实仍然存在少量差异,有些是有意的和装饰性的,有些只是因为需要更多时间与 OpenJDK 贡献者讨论。

        • Oracle JDK 11 在使用 -XX:+UnlockCommercialFeatures 选项时会发出警告,而在 OpenJDK 构建中,此选项会导致错误。这个选项从来都不是 OpenJDK 的一部分,现在添加它没有意义,因为 OpenJDK 中没有商业功能。保留此差异是为了使 Oracle JDK 10 及更早版本的用户更容易迁移到 Oracle JDK 11 及更高版本。
        • Oracle JDK 11 可以配置为向“Advanced Management Console”工具提供使用日志数据,这是一个单独的商业 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

        这种差异仍然存在,以便为特定类型的旧式使用提供一致的体验。这些模块要么现在作为OpenJFX 的一部分单独提供,要么现在在 OpenJDK 和 Oracle JDK 中,因为它们是 Oracle 为 OpenJDK 贡献的商业功能(例如,Flight Recorder),或者从 Oracle JDK 11 中删除(例如, JNLP)。

        • java --version 和 java -fullversion 命令的输出将区分 Oracle JDK 构建和 OpenJDK 构建,以便支持团队可以诊断任何可能存在的问题。具体来说,使用 Oracle JDK 11 构建运行 java --version 会导致:

        java 11 2018-09-25

        Java(TM) SE 运行时环境 18.9(内部版本 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-Bit Server VM 18.9(build 11+28,混合模式)

        • Oracle JDK 一直要求第三方加密提供程序由已知证书签名。 OpenJDK 中的加密框架具有开放的加密接口,这意味着它不限制可以使用哪些提供程序。 Oracle JDK 11 将继续require 有效签名,Oracle OpenJDK 构建将继续允许使用有效签名或未签名的第三方加密提供程序。
        • Oracle JDK 11 将继续包括安装程序、品牌和 JRE 打包,以提供与旧桌面使用一致的体验。 Oracle OpenJDK 构建目前以 zip 和 tar.gz 文件的形式提供,同时正在考虑替代分发格式。

        【讨论】:

          【解决方案8】:

          对于 Java 8interesting 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 的 CPU 使用率高于 OracleJDK,
          • OpenJDK 的响应时间略低于 OracleJDK,
          • OpenJDK 的内存使用率高于 OracleJDK,

          详情请看源文章。

          当然是 YMMV,这只是基准之一。

          【讨论】:

            【解决方案9】:

            对于 Java 7,没有什么重要的。 OpenJDK项目主要基于Sun捐赠的HotSpot源代码。

            此外,OpenJDK 被选为reference implementation for Java 7,由 Oracle 工程师维护。

            difference between JVM, JDK, JRE & OpenJDK 上有 2012 年的更详细答案,链接到 an Oracle blog post

            Q:在OpenJDK中找到的源代码有什么区别 存储库,以及用于构建 Oracle JDK 的代码?

            A:非常接近 - 我们为 Oracle JDK 发布构建的构建过程 在 OpenJDK 7 上,只需添加几部分,例如部署代码, 其中包括 Oracle 对 Java 插件和 Java 的实现 WebStart,以及一些封闭源代码的第三方组件,如 图形光栅化器,一些开源的第三方组件,比如 犀牛,还有一些零零碎碎的东西,比如额外的 文档或第三方字体。展望未来,我们的目标是 开源 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 希望如果 google 转向 OpenJDK,他们将为上游提供性能补丁,以便它在 Android 之外的 ARM 上也能正常运行!
            【解决方案10】:

            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
            • 请注意,对于 java 的新发布模型,Oracle 计划尽可能减少两个 jdk 之间的差距。除了 oracle 开发者,还有其他开源贡献者开放 jdk 吗?这是为了了解是否有足够的支持将修复从最新版本反向移植到以前的版本。有什么想法吗?
            【解决方案11】:

            可以在这篇博文中找到 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 构建。

            【讨论】:

            【解决方案12】:

            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 是从哪里建立的?
            【解决方案13】:

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

            OpenJDK

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

            Oracle JDK

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

            来源: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/…。这种新发布策略的主要目标是不花时间维护旧版本。如果支持是免费的,那么模型将和现在一样。
            猜你喜欢
            • 2018-10-26
            • 1970-01-01
            • 2016-12-13
            • 2013-06-25
            • 2019-04-21
            • 1970-01-01
            相关资源
            最近更新 更多