注:此问题来自2014年。截至Java 11 OpenJDK和OracleJDK正在融合。

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

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

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


当前回答

根据oracle博客,oracle JDK发布Java 11及更高版本

从Java 11开始,Oracle将根据开源GNU通用公共许可证v2、Classpath例外(GPLv2+CPE)以及商业许可证为那些将Oracle JDK作为Oracle产品或服务的一部分或不希望使用开源软件的人提供JDK版本。这种使用开源许可证和商业许可证的组合取代了历史上的“BCL”许可证,该许可证包含免费和付费商业条款。

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

从BCL到GPL

十多年来,Oracle Java SE技术的二进制代码许可证(“BCL”)一直是Oracle Java SE的主要许可证。BCL允许在某些条件下使用,无需支付许可费。为了简化今后的工作,Oracle从Java9开始提供开源许可的OpenJDK版本,使用与Linux平台相同的许可模型。如果您习惯于免费获取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飞行记录仪,Java任务控制,应用程序类数据共享,以及ZGC。

因此,从Java11开始,OracleJDK版本和OpenJDK版本将基本相同。

……但在化妆品和包装方面存在一些差异

仍然存在少量的差异,有些是故意的,有些是表面的,有些只是因为需要更多的时间与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.basejavafx控件javafx.fxmljavafx.graphicsjavafx.mediajavafx.webjava.jnlpjdk.jfr公司jdk.管理.cmmjdk.management.jfrjdk.management资源jdk.packager.servicesjdk.snmp

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

java-version和java-fullversion命令的输出将区分OracleJDK版本和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,混合模式)

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

其他回答

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

此外,OpenJDK被选为Java7的参考实现,并由Oracle工程师维护。

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

Q: OpenJDK中的源代码有什么不同存储库,以及用于构建Oracle JDK的代码?A: 它非常接近-我们的Oracle JDK版本构建过程在OpenJDK7上,其中包括Oracle对Java插件和Java的实现WebStart以及一些封闭源代码的第三方组件,如图形光栅化器,一些开源第三方组件,如犀牛,还有一些零碎的东西文档或第三方字体。继续前进,我们的目标是开源OracleJDK的所有部分,我们考虑的除外商业功能,如JRockit任务控制(尚未提供在Oracle JDK中),并用开源替代方案,以实现代码之间更接近的对等性基础。

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

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

JDK的大多数供应商都是在OpenJDK的基础上编写的,他们在不破坏TCK兼容性的情况下对组件进行了一些调整[主要是为了替换许可的专有部件/替换为仅适用于特定OS的更高性能的项目]。

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

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

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

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

参考:Java虚拟机列表

Oracle和OpenJDKJVM是相同的,并且具有相同的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`

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

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

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

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

OpenJDK

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

Oracle JDK

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

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