Oracle JDK和OpenJDK的区别

注意:此问题来自2014年。截至Java11 OpenJDK和OracleJDK正在收敛。

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

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

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

630485 次浏览

对于Java7,没有什么至关重要的。OpenJDK项目主要基于Sun捐赠的热点源代码。

此外,OpenJDK被选为Java参考实施,由Oracle工程师维护。

2012年在JVM、JDK、JRE和OpenJDK之间的区别上有一个更详细的答案,链接到一篇Oracle博客文章

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

一个:非常接近-我们的Oracle JDK版本构建过程在OpenJDK 7上,只需添加几个部分,例如部署代码,其中包括Oracle实现的Java插件和JavaWebStart,以及一些闭源第三方组件,如图形光栅化器,一些开源的第三方组件,比如犀牛,还有这里和那里的一些碎片,就像额外的留档或第三方字体。向前看,我们的目的是开源Oracle JDK的所有部分,除了我们考虑的部分商业功能,如JRockit任务控制(尚未提供)在Oracle JDK中),并将受限制的第三方组件替换为开源替代方案以实现代码之间更紧密的平价下一篇:

OpenJDK和Oracle JDK目前仅由Oracle创建和维护。

OpenJDK和Oracle JDK是通过TCK(Java技术认证工具包)的相同Java规范的实现。

大多数JDK供应商都是在OpenJDK之上编写的,通过做一些调整来[主要是替换许可的专有部件/替换为仅适用于特定操作系统的更多高性能项目]组件,而不会破坏TCK兼容性。

许多供应商实现了Java规范并通过了TCK。例如,IBMJ9、Azul Zulu、Azul Zing和Oracle JDK。

几乎所有现有的JDK都源自OpenJDK。

正如许多人所建议的那样,许可是JDK之间的变化。

从JDK 11开始访问长期支持Oracle JDK/JavaSE现在需要商业许可证。您现在应该注意您正在安装哪个JDK,因为没有订阅的Oracle JDK可能会停止工作。来源

参考:Java虚拟机列表

对于Java8,Oracle JDK与OpenJDK我对关键差异的看法:

  • OpenJDK是Java标准版平台的开源实现,由Oracle和开放Java社区贡献。

  • OpenJDK在许可证GPL v2下发布,其中Oracle JDK根据Oracle二进制代码许可协议获得许可。

  • 实际上,Oracle JDK的构建过程是从OpenJDK源代码构建的。因此Oracle JDK和OpenJDK之间没有重大的技术差异。除了基本代码之外,Oracle JDK还包括Oracle的JavaPlugin和JavaWebStart的实现。它还包括第三方闭源和开源组件,分别是图形光栅化器和犀牛。OpenJDK字体渲染器和Oracle JDK飞行记录器是Oracle JDK和OpenJDK之间明显的主要区别。

  • Rockit是Oracle的JVM,从JavaSE 7开始,HotSpot和JRockit合并为一个JVM。所以现在我们只有合并后的HotSpot JVM可用。
  • 有些情况下,人们声称他们在运行OpenJDK时遇到了问题,并且在切换到Oracle JDK时得到了解决。
  • Twitter有自己的JDK。
  • 像Minecraft这样的软件希望使用Oracle JDK。事实上,警告。

有关差异的完整列表,请参阅源文章:Oracle JDK vs OpenJDK和JavaJDK开发过程

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

OpenJDK

OpenJDK将每6个月发布一次功能,直到下一个功能发布为止。它本质上是针对开发人员的持续发布流。

oracleJDK

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

在此处输入图片描述

来源:https://www.oracle.com/java/java9-screencasts.html?bcid=5582439790001&; playerType=单社交&大小=事件

Oracle和OpenJDK JVM是相同的,并且具有相同的GC功能(截至最新版本10+)。在Oracle管理OpenJDK JVM之前,存在一些具体的差异,使得旧的Openjdk JVM在许多环境中几乎无法使用。JVM现在是一样的。

将JVM作为工具包的一部分包含在内的JDK因许可、发布和维护计划以及JDK中包含的软件库而不同。对我来说,关键的差异也意味着如果不存在,代码将无法运行。不仅仅是许可。

diff --brief -r openjdk oraclejdk

至关重要的是,除了linux JDK上的一堆其他文件之外,还缺少以下文件(因此,如果您“声称”代码在OpenJDK上不起作用,并且在使用javafx时在OracleJDK上这样做,那么您是正确的):

Only in jdk-10.0.1/bin: javapackagerOnly in jdk-10.0.1/bin: javawsOnly in jdk-10.0.1/bin: jcontrolOnly in jdk-10.0.1/bin: jmcOnly in jdk-10.0.1/bin: jweblauncherOnly in jdk-10.0.1/lib: ant-javafx.jarOnly in jdk-10.0.1/lib: deployOnly in jdk-10.0.1/lib: deploy.jarOnly in jdk-10.0.1/lib: desktopOnly in jdk-10.0.1/lib: fontconfig.bfcOnly in jdk-10.0.1/lib: fontconfig.properties.srcOnly in jdk-10.0.1/lib: fontconfig.RedHat.6.bfcOnly in jdk-10.0.1/lib: fontconfig.RedHat.6.properties.srcOnly in jdk-10.0.1/lib: fontconfig.SuSE.11.bfcOnly in jdk-10.0.1/lib: fontconfig.SuSE.11.properties.srcOnly in jdk-10.0.1/lib: fontsOnly in jdk-10.0.1/lib: javafx.propertiesOnly in jdk-10.0.1/lib: javafx-swt.jarOnly in jdk-10.0.1/lib: java.jnlp.jarOnly in jdk-10.0.1/lib: javaws.jarOnly in jdk-10.0.1/lib: jdk.deploy.jarOnly in jdk-10.0.1/lib: jdk.javaws.jarOnly in jdk-10.0.1/lib: jdk.plugin.jarOnly in jdk-10.0.1/lib: jfrOnly in jdk-10.0.1/lib: libavplugin-53.soOnly in jdk-10.0.1/lib: libavplugin-54.soOnly in jdk-10.0.1/lib: libavplugin-55.soOnly in jdk-10.0.1/lib: libavplugin-56.soOnly in jdk-10.0.1/lib: libavplugin-57.soOnly in jdk-10.0.1/lib: libavplugin-ffmpeg-56.soOnly in jdk-10.0.1/lib: libavplugin-ffmpeg-57.soOnly in jdk-10.0.1/lib: libbci.soOnly in jdk-10.0.1/lib: libcmm.soOnly in jdk-10.0.1/lib: libdecora_sse.soOnly in jdk-10.0.1/lib: libdeploy.soOnly in jdk-10.0.1/lib: libfxplugins.soOnly in jdk-10.0.1/lib: libglassgtk2.soOnly in jdk-10.0.1/lib: libglassgtk3.soOnly in jdk-10.0.1/lib: libglass.soOnly in jdk-10.0.1/lib: libgstreamer-lite.soOnly in jdk-10.0.1/lib: libjavafx_font_freetype.soOnly in jdk-10.0.1/lib: libjavafx_font_pango.soOnly in jdk-10.0.1/lib: libjavafx_font.soOnly in jdk-10.0.1/lib: libjavafx_iio.soOnly in jdk-10.0.1/lib: libjfxmedia.soOnly in jdk-10.0.1/lib: libjfxwebkit.soOnly in jdk-10.0.1/lib: libnpjp2.soOnly in jdk-10.0.1/lib: libprism_common.soOnly in jdk-10.0.1/lib: libprism_es2.soOnly in jdk-10.0.1/lib: libprism_sw.soOnly in jdk-10.0.1/lib: librm.soOnly in jdk-10.0.1/lib: libt2k.soOnly in jdk-10.0.1/lib: localeOnly in jdk-10.0.1/lib: missioncontrolOnly in jdk-10.0.1/lib: oblique-fontsOnly in jdk-10.0.1/lib: plugin.jarOnly in jdk-10.0.1/lib: plugin-legacy.jarOnly in jdk-10.0.1/lib/security: blacklistOnly in jdk-10.0.1/lib/security: public_suffix_list.datOnly in jdk-10.0.1/lib/security: trusted.librariesOnly in openjdk-10.0.1: man`

Oracle JDK 11和OpenJDK 11之间剩下的几个外观和包装差异的列表可以在这篇博文中找到:

https://blogs.oracle.com/java-platform-group/oracle-jdk-releases-for-java-11-and-later

简而言之:

  • Oracle JDK 11在使用-XX:+Unlock商业功能选项时发出警告,
  • 它可以配置为向“高级管理控制台”工具提供使用日志数据,
  • 它一直要求第三方加密提供商由已知证书签名,
  • 它将继续包括安装程序,品牌和JRE包装,
  • 对于Java9和Java10的目标,javac--释放命令的行为略有不同
  • java--version和java-fullversion命令的输出将区分Oracle JDK构建和OpenJDK构建。

根据甲骨文博客,适用于Java11及更高版本的Oracle JDK版本

从Java11开始,甲骨文将在开源GNU通用公共许可证v2,带有类路径异常(GPLv2+CPE)和商业许可证下为那些将甲骨文JDK作为甲骨文产品或服务的一部分使用或不希望使用开源软件的人提供JDK版本。这种使用开源许可证和商业许可证的组合取代了历史上的“BCL”许可证,后者结合了免费和付费的商业条款。

每个许可证将提供不同的构建,但除了一些外观和包装差异之外,这些构建在功能上是相同的,下面将详细描述。

从BCL到GPL

十多年来,OracleJavaSE技术的二进制代码许可证(“BCL”)一直是OracleJavaSE技术的主要许可证。BCL允许在某些条件下免费使用。为了简化未来的事情,Oracle从Java9开始使用提供开源许可的OpenJDK构建,使用与Linux平台相同的许可证模型。如果您习惯于免费获得OracleJavaSE二进制文件,您可以简单地继续使用Oracle的OpenJDK版本在jdk.java.net中提供。如果您习惯于将OracleJavaSE二进制文件作为Oracle商业产品或服务的一部分,那么您可以继续通过我的Oracle支持(MOS)和其他位置获得Oracle JDK版本。

功能相同且可互换…

Oracle的BCL许可JDK历史上包含OpenJDK版本中不可用的“商业功能”。正如承诺的那样然而,在过去的一年中,Oracle为OpenJDK社区贡献了这些功能,包括:

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

…但有一些化妆品和包装的差异

仍然存在少量的差异,有些是故意的和表面上的,有些只是因为需要更多的时间与OpenJDK贡献者讨论。

  • Oracle JDK 11在使用-XX:+Unlock商业功能选项时会发出警告,而在OpenJDK中构建此选项会导致错误。此选项从未成为OpenJDK的一部分,现在添加它也没有意义,因为OpenJDK中没有商业功能。保留此差异是为了让Oracle JDK 10及更早版本的用户更容易迁移到Oracle JDK 11及更高版本。
  • Oracle JDK 11可以配置为向“高级管理控制台”工具提供使用情况日志数据,这是一个单独的商业Oracle产品。我们将与其他OpenJDK贡献者合作,讨论这些使用情况数据在OpenJDK的未来版本中如何有用(如果有的话)。这种差异主要是为了在做出此类决定之前为Oracle客户提供一致的体验。
  • 对于Java9和Java10的目标,javac--释放命令的行为不同,因为在这些版本中,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贡献的商业功能(例如,飞行记录器),或者从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)

JavaHotSpot(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文件的形式提供,同时正在考虑替代分发格式。

同样对于Java8AMIS Technology Blog在各种JVM上托管的反应式(非阻塞)Spring Boot REST应用程序的有趣性能基准已于2018年11月发布,除其他差异外:

  • OpenJDK的CPU使用率高于OracleJDK,
  • OpenJDK的响应时间略低于OracleJDK,
  • OpenJDK的内存使用率高于OracleJDK,

有关详细信息,请参阅源文章。

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

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

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

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

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

  1. 甲骨文将每三年发布一次,而OpenJDK将每六个月发布一次。
  2. Oracle为其版本提供长期支持。另一方面另一方面,OpenJDK只支持对版本的更改,直到下一个版本版本已发布。
  3. Oracle JDK根据Oracle二进制代码许可协议获得许可,而OpenJDK有GNU通用公共许可证(GNU GPL)版本2带有链接异常。
  4. Oracle产品有飞行记录仪、Java任务控制和应用程序类数据共享功能,而OpenJDK具有字体渲染器功能。此外,Oracle有更多垃圾收集选项更好的渲染器,
  5. Oracle JDK由Oracle Corporation完全开发,而OpenJDK由Oracle,OpenJDK和Java社区开发。然而,像红帽、Azul Systems、IBM、苹果公司、SAP AG也积极参与其开发。

从Java11转折到大变故

甲骨文将改变其历史上的“BCL”许可证,结合开源和商业许可证

  • Oracle的Java套件在使用-XX:+Unlock商业功能选项时会发出警告,而在OpenJDK构建中,此选项会导致错误
  • Oracle JDK提供了向“高级管理控制台”工具提供使用日志数据的配置
  • Oracle一直要求第三方加密提供者由已知证书签名,而OpenJDK中的加密框架具有开放的加密接口,这意味着可以使用哪些提供者没有限制
  • Oracle JDK 11将继续包含安装程序、品牌和JRE打包,而OpenJDK版本目前以zip和tar.gz文件的形式提供
  • 由于Oracle版本中存在一些额外的模块,因此javac命令对Java9和Java10目标的行为不同
  • java-version和java-fullversion命令的输出将区分Oracle的构建和OpenJDK构建


更新:25-八月-2019



在此处输入图片描述

更多详情oracle-vs-openjdk开发环境

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

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

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

这是非常接近的-我们的Oracle JDK版本的构建过程建立在OpenJDK 7的基础上,只添加了几个部分,如部署代码,其中包括Oracle的Java插件和JavaWebStart的实现,以及一些闭源第三方组件,如图形光栅化器,一些开源第三方组件,如Rhino,以及一些零碎的东西,如其他留档或第三方字体。展望未来,我们打算开源Oracle JDK的所有部分,除了那些我们认为具有商业功能的部分,例如JRockit任务控制(在Oracle JDK中尚不可用),并用开源替代方案替换受阻碍的第三方组件,以实现代码库之间更紧密的对等。

垃圾回收机制和其他JVM参数是相同的。

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

OpenJDK

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

oracleJDK

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

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