Oracle JDK和OpenJDK之间的差异

use*_*582 651 java difference

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

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

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

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

rad*_*dai 321

对于Java 7,没什么关键.OpenJDK项目主要基于Sun捐赠的HotSpot源代码.

此外,OpenJDK被选为Java 7参考实现,由Oracle工程师维护.

关于JVM,JDK,JRE和OpenJDK之间的区别,2012年有一个更详细的答案,它链接到Oracle博客帖子:

:OpenJDK存储库中的源代码与用于构建Oracle JDK的代码之间有什么区别?

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

  • 还存在许可差异. (41认同)
  • 谢谢我找到了一个更好的答案.http://stackoverflow.com/questions/17360011/technically-what-is-the-main-difference-between-oracle-jdk-and-open-jdk#comment27153592_17364418 (9认同)
  • 在ARM上,至少这两个似乎在性能上有很大不同.我将不得不对其发生的原因进行一些分析,但主观区别是"Oracle JDK没问题"和"OpenJDK完全无法使用". (9认同)

Ven*_*Rao 304

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

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

大多数JDK的厂商都做了一些调整,以[大多以取代许可的专用部件/更高性能的项目,只能在特定的操作系统工作更换]部件没有打破TCK兼容性写在OpenJDK的顶部.

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

几乎每个现有的JDK都派生自OpenJDK.

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

从JDK 11开始访问长时间支持Oracle JDK/Java SE现在需要商业许可证.您现在应该注意您正在安装的JDK,因为没有订阅的Oracle JDK可能会停止工作.资源

参考:Java虚拟机列表

  • 我迟到了,但无论如何我都会问.jdk给openjdk没有带来什么?所有这些答案都使得openjdk听起来像是在各方面都是等于或优越的,但如果是这样的话,为什么Oracle甚至还在为维护jdk而烦恼呢? (22认同)
  • 所以你说openjdk是所有其他jdks的基线,只是他们复制它然后按照自己的规格调整它? (12认同)
  • @ Mella OpenJDK <= OracleJDK例如,Oracle JDK设置了很少的可信密钥,这些密钥不在OpenJDK中(现在人们只是导入它们以填补这个空白)Oracle JDK有一些SWING库,它们是加速渲染的专有..(谁曾经做过服务器应用程序,可能与他们无关)Oracle JDK有Applet插件(上述工作原理相同)Oracle JDK bugfix/hotfix将由Oracle正确分发和处理,其中As OpenJDK几乎没有技术确保所有的应用补丁以及它们会产生什么冲突 (11认同)

The*_*ger 89

未来的一个关键差异是发布计划和支持政策.

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的商业支持吗? (3认同)

小智 35

对于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与OpenJDK和Java JDK开发过程

  • 对于Android Studio,这已不再适用:最新的OpenJDK副本与Android Studio 2.2及更高版本捆绑在一起,这是我们建议您用于Android项目的JDK版本.资料来源:https://developer.android.com/studio/intro/studio-config#jdk (4认同)

小智 25

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

包含JVM作为Kit的一部分的JDK因许可,发布和维护计划以及JDK中包含的软件库而不同.对我来说至关重要的区别也意味着如果不存在代码就会使代码无法运行.不仅许可.

diff --brief -r openjdk oraclejdk
Run Code Online (Sandbox Code Playgroud)

至关重要的是除了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`
Run Code Online (Sandbox Code Playgroud)

  • 感谢您指出“真实”差异:代码未运行是现实生活中的事情。您从何处开始使用`diff`? (5认同)

Nar*_*shi 15

根据oracle博客,Oracle JDK Releases for Java 11及更高版本

从Java 11开始,Oracle将在开源GNU通用公共许可证v2下提供JDK版本,具有类路径异常(GPLv2 + CPE),并且在使用Oracle JDK作为Oracle产品或服务的一部分的商业许可下提供,或者谁不想使用开源软件.这种使用开源许可证和商业许可证的组合取代了历史上的" BCL "许可证,该许可证具有免费和付费商业条款的组合.

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

从BCL到GPL

Oracle Java SE技术二进制代码许可证("BCL")十多年来一直是Oracle Java SE技术的主要许可证.在某些条件下,BCL允许在没有许可费的情况下使用.为了简化未来的发展,Oracle开始使用与Linux平台相同的许可证模型,从Java 9 开始提供开源许可的OpenJDK构建.如果您习惯于免费获取Oracle Java SE二进制文件,则可以使用jdk.java.net上提供的Oracle OpenJDK版本继续执行此操作.如果您习惯将Oracle Java SE二进制文件作为Oracle的商业产品或服务的一部分,那么您可以继续通过My Oracle Support(MOS)和其他位置获取Oracle JDK版本.

功能相同且可互换......

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

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

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

确实存在少量差异,有些是有意的,有些是装饰性的,有些只是因为有更多时间与OpenJDK贡献者讨论是有道理的.

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

这种差异仍然存在,以便为特定种类的遗留用途提供一致的体验.这些模块现在作为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将继续需要有效签名,Oracle OpenJDK版本将继续允许使用有效签名或未签名的第三方加密提供程序.
  • Oracle JDK 11将继续包括安装程序,品牌和JRE打包,以获得与旧桌面使用一致的体验.Oracle OpenJDK构建目前以zip和tar.gz文件的形式提供,而正在考虑其他分发格式.


Ist*_*ain 12

  1. Oracle 每三年发布一次,而 OpenJDK 每六个月发布一次。
  2. Oracle 为其版本提供长期支持。另一方面,OpenJDK 仅在下一个版本发布之前支持对版本的更改。
  3. Oracle JDK 根据 Oracle 二进制代码许可协议获得许可,而 OpenJDK 具有 GNU 通用公共许可证 (GNU GPL) 版本 2,但有一个链接例外。
  4. Oracle 产品具有 Flight Recorder、Java Mission Control 和 Application Class-Data Sharing 特性,而 OpenJDK 具有 Font Renderer 特性。此外,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 文件形式提供
  • javac –release 命令对于 Java 9 和 Java 10 目标的行为不同,因为 Oracle 的版本中存在一些附加模块
  • java –version 和 java -fullversion 命令的输出将区分 Oracle 的构建和 OpenJDK 的构建


更新 : 25-Aug-2019



在此处输入图片说明

有关更多详细信息oracle-vs-openjdk


Dal*_*pic 10

可以在此博客文章中找到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构建区分开来.

  • 我注意到您的大多数答案都带有签名。我已经将它们删除了。请阅读[是否禁止标语和签名?](https://meta.stackexchange.com/questions/5029/are-taglines-signatures-disallowed)和https://stackoverflow.com/help/behavior(特别是“请勿使用签名,标语或问候语。”) (2认同)

Gre*_*cki 6

此外,对于Java 8, AMIS 技术博客已于 2018 年 11 月发布了一个有趣的反应式(非阻塞)Spring Boot REST 应用程序性能基准测试,该应用程序托管在各种 JVM 上,其中显示了以下差异:

  • OpenJDK 的 CPU 使用率比 OracleJDK 更高,
  • OpenJDK 的响应时间比 OracleJDK 稍短,
  • OpenJDK 的内存使用量比 OracleJDK 更高,

详细内容请参见来源文章。

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


Gil*_*ili 5

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

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

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

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


log*_*sex 5

OpenJDK

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

甲骨文JDK

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

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