Oracle JDK和OpenJDK之间的差异

时间:2014-03-12 16:36:33

标签: java difference

  

注意:此问题来自2014年。自Java 11 OpenJDK和Oracle起   JDK正在融合。

Oracle和OpenJDK之间是否存在重大差异?

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

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

13 个答案:

答案 0 :(得分:320)

对于 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的代码?

     

A :非常接近 - 我们的Oracle JDK版本构建流程   在OpenJDK 7上添加几个部分,比如部署代码,   其中包括Oracle的Java插件和Java的实现   WebStart,以及一些闭源第三方组件,如   图形光栅化器,一些开源的第三方组件,如   犀牛,还有一些点点滴滴,就像其他的一样   文档或第三方字体。展望未来,我们的目的是   开源所有Oracle JDK,除了我们考虑的那些   商业功能,如JRockit Mission Control(尚未提供)   在Oracle JDK中),并用。替换受阻的第三方组件   开源替代方案,以实现代码之间更密切的平等   碱基。

答案 1 :(得分:270)

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

答案 2 :(得分:82)

未来的主要差异是发布计划和支持政策。

的OpenJDK

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

Oracle JDK

Oracle JDK的目标更多是针对重视稳定性的企业用户。它基于OpenJDK的一个版本,但是  然后获得长期支持(LTS)。 Oracle JDK每3年发布一次。

enter image description here

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

答案 3 :(得分:30)

对于 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插件和Java WebStart的实现。它还包括第三方封闭源和开源组件,如图形光栅器和Rhino。 OpenJDK Font Renderer和Oracle JDK Flight Recorder是Oracle JDK和OpenJDK之间明显的主要区别。

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

有关差异的完整列表,请参阅源文章:Oracle JDK vs OpenJDK and Java JDK Development Process

答案 4 :(得分:18)

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: 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`

答案 5 :(得分:12)

根据oracle博客Oracle JDK Releases for Java 11 and Later

从Java 11开始,Oracle将在开源GNU General Public License v2, with the Classpath Exception (GPLv2+CPE)下并根据商业许可向使用Oracle JDK作为Oracle产品或服务的一部分或不希望使用JDK的人提供JDK版本。开源软件。使用开放源代码许可证和商业许可证的这种组合取代了具有免费和付费商业条款的历史“ 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获得Oracle Java SE二进制文件作为商业产品或服务的一部分,那么可以继续通过My Oracle Support(MOS)和其他位置获得Oracle JDK版本。

功能相同且可互换...

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

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

...但是在外观和包装上有所不同

确实存在少量差异,一些是故意的和修饰性的,有些仅仅是因为有更多的时间与OpenJDK贡献者讨论。

  • 当使用-XX:+ UnlockCommercialFeatures选项时,Oracle JDK 11会发出警告,而在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位服务器VM 18.9(内部版本11 + 28,混合模式)

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

答案 6 :(得分:8)

可以在此博客文章中找到Oracle JDK 11和OpenJDK 11之间剩余的一些外观和包装差异的列表:

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

简而言之:

  • 使用-XX:+ UnlockCommercialFeatures选项时,Oracle JDK 11会发出警告,
  • 可以将其配置为向“高级管理控制台”工具提供使用情况日志数据,
  • 一直要求第三方加密提供商使用已知证书签名
  • 它将继续包括安装程序,品牌和JRE包装,
  • 而javac --release命令对于Java 9和Java 10目标的行为略有不同,并且
  • java --version和java -fullversion命令的输出将使Oracle JDK构建与OpenJDK构建区分开。

答案 7 :(得分:4)

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

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

每6个月,这两个代码库将保持同步。但是在6个月的窗口中,OpenJDK将仅收到安全更新,而OracleJDK将收到其他稳定性和性能更新。

鉴于OpenJDK和OracleJDK的更新版本仅每3个月出现一次,这意味着您(最多)缺少3个月的修补程序,直到发布下一个主要版本并进行升级为止。但是,如果您选择坚持使用LTS版本,则商业许可开始变得更有意义。

答案 8 :(得分:2)

对于 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的CPU使用率高于OracleJDK,
  • OpenJDK的响应时间比OracleJDK短,
  • OpenJDK的内存使用率高于OracleJDK,

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

当然,这是基准测试之一。

答案 9 :(得分:1)

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

  

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

更新:我错了。我可以免费使用Oracle JDK,但是6个月后将无法获得安全更新,因此我们必须承担风险。请查看以上链接的文章部分“新版本对我的公司意味着什么?”。

答案 10 :(得分:0)

  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, 苹果公司SAP AG也积极参与其开发。

从Java 11转变为重大变化

Oracle将结合开放源代码和商业许可证来更改其历史“ BCL”许可证

  • 使用-XX:+ UnlockCommercialFeatures选项时,Oracle Java 11套件会发出警告,而在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的版本

答案 11 :(得分:0)

这非常接近-我们针对Oracle JDK的构建过程基于OpenJDK 7发行,仅添加了几段内容,例如部署代码,其中包括Oracle对Java Plugin和Java WebStart的实现,以及一些封闭源代码第三方组件(例如图形光栅化器),一些开源第三方组件(例如Rhino)以及一些零散的地方,例如其他文档或第三方字体。展望未来,我们打算将Oracle JDK的所有部分开源,但那些我们认为具有商业功能的部分(如JRockit Mission Control(Oracle JDK中尚不可用)),并用开源替代品替代受累的第三方组件,以实现两者之间更紧密的平衡代码库。

·是的,垃圾回收和其他JVM参数是相同的。

·两者的GC性能相同。

答案 12 :(得分:0)

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