注意:此问题来自2014年。自Java 11 OpenJDK和Oracle起 JDK正在融合。
Oracle和OpenJDK之间是否存在重大差异?
例如,垃圾收集和其他JVM参数是否相同?
GC在两者之间的工作方式不同吗?
答案 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
答案 2 :(得分:82)
未来的主要差异是发布计划和支持政策。
OpenJDK将每6个月发布一次功能,直到下一个功能发布才支持。它本质上是针对开发人员的连续发布流。
Oracle JDK的目标更多是针对重视稳定性的企业用户。它基于OpenJDK的一个版本,但是 然后获得长期支持(LTS)。 Oracle JDK每3年发布一次。
答案 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之间明显的主要区别。
有关差异的完整列表,请参阅源文章: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贡献者讨论。
保留此差异是为了为特定种类的传统使用提供一致的体验。这些模块现在可以作为OpenJFX的一部分单独使用,现在可以在OpenJDK和Oracle JDK中使用,因为它们是Oracle向OpenJDK贡献的商业功能(例如,Flight Recorder),或者已从Oracle JDK 11中删除(例如JNLP)。
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,混合模式)
答案 6 :(得分:8)
可以在此博客文章中找到Oracle JDK 11和OpenJDK 11之间剩余的一些外观和包装差异的列表:
https://blogs.oracle.com/java-platform-group/oracle-jdk-releases-for-java-11-and-later
简而言之:
答案 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也显示了这一点以及其他差异:
有关详细信息,请参阅源文章。
当然,这是基准测试之一。
答案 9 :(得分:1)
我的理解是Oracle JDK不能在生产中使用,因此我不能合法地(无需付费)使用它为我的公司构建的Web应用程序。我必须使用OpenJDK。如果我错了,请纠正我!来自this article。
从Java 11开始,Oracle JDK仅限于开发和 测试环境。 Oracle JDK仅在以下情况下可用于生产中 您购买商业支持。相反,Oracle将提供Java 免费基于OpenJDK构建,可在生产中使用。但 对于正式的Oracle JDK,真正的路线图将如下所示:
更新:我错了。我可以免费使用Oracle JDK,但是6个月后将无法获得安全更新,因此我们必须承担风险。请查看以上链接的文章部分“新版本对我的公司意味着什么?”。
答案 10 :(得分:0)
从Java 11转变为重大变化
Oracle将结合开放源代码和商业许可证来更改其历史“ BCL”许可证
答案 11 :(得分:0)
这非常接近-我们针对Oracle JDK的构建过程基于OpenJDK 7发行,仅添加了几段内容,例如部署代码,其中包括Oracle对Java Plugin和Java WebStart的实现,以及一些封闭源代码第三方组件(例如图形光栅化器),一些开源第三方组件(例如Rhino)以及一些零散的地方,例如其他文档或第三方字体。展望未来,我们打算将Oracle JDK的所有部分开源,但那些我们认为具有商业功能的部分(如JRockit Mission Control(Oracle JDK中尚不可用)),并用开源替代品替代受累的第三方组件,以实现两者之间更紧密的平衡代码库。
·是的,垃圾回收和其他JVM参数是相同的。
·两者的GC性能相同。
答案 12 :(得分:0)
OpenJDK
Oracle JDK
来源:https://o7planning.org/12571/history-of-java-and-the-difference-between-oracle-jdk-and-openjdk