Oracle JDK和OpenJDK之间的区别


699

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

Oracle和OpenJDK之间有什么重要区别吗?

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

两者之间的GC工作方式是否有所不同?


3
如果您打算从Oracle迁移到OpenJDK,这可能也很重要,因为Oracle不再免费了。developers.redhat.com/blog/2018/11/05/...
狮子座Ufimtsev

Answers:


338

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

OpenJDK和Oracle JDK是通过TCK(Java技术认证套件)的同一Java规范的实现。

JDK的大多数供应商都是在OpenJDK之上编写的,它们做了一些调整[主要是替换许可的专有部件/替换为仅在特定OS上可用的更多高性能项目]组件,而又没有破坏TCK兼容性。

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

几乎每个现有的JDK都来自OpenJDK。

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

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

参考:Java虚拟机列表


13
因此,您说openjdk是所有其他jdks的基线,只是它们复制了它,然后根据其自己的规范对其进行了调整?
莫里森

24
我参加聚会迟到了,但是我还是要问。jdk带给openjdk没有的表什么?所有这些答案使openjdk听起来在各个方面都相等或更高,但是如果是这样的话,为什么Oracle甚至还要维护jdk?
凯夫卡

@ Karl Morrison据我所知,..每个实现JVM规范的人都只能这样做。.但是没有明确的规则必须遵循这种方式……
Venkateswara Rao

13
@ Mella OpenJDK <= OracleJDK例如,Oracle JDK设置的信任密钥很少,而OpenJDK中没有(现在人们只是导入它们来填补这一空白)Oracle JDK拥有一些SWING库,这些库可以加快渲染速度..(谁做服务器应用程序可能与他们无关)Oracle JDK具有Applet插件(与上面的工作原理相同)Oracle将对Oracle JDK错误修复程序/修补程序进行正确分发和处理,因为OpenJDK几乎无法确保所有补丁已应用,它们将产生什么冲突
Venkateswara Rao

注意,对于Java的新发行模型,Oracle计划尽可能减少两个jdk之间的差距。除了Oracle开发人员以外,还有其他开放源代码提供者可以打开jdk吗?这是为了了解是否有足够的支持将修补程序从最新版本回移植到先前版本。有什么想法吗?
安迪·杜弗雷斯

329

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

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

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

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

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


42
也存在许可差异。
mcoolive

9
谢谢,我找到了一个更好的答案。 stackoverflow.com/questions/17360011/...
astroanu

9
在ARM上,至少这两个在性能上似乎有很大不同。我将不得不对它为什么发生进行一些分析,但是主观的区别是“ Oracle JDK可以”和“ OpenJDK完全不可用”。
2015年

1
尽管如此,@ dualed还是android从android 7开始转向openjdk。venturebeat.com/2015/12/29/…–
约翰尼·多伊

1
@JohnnyDoe让我们希望,如果Google迁移到OpenJDK,他们将向上游提供性能补丁,以便它也可以在Android以外的ARM上良好运行!
2016年

95

未来的主要区别是发布时间表和支持策略。

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


3
长期发行需要您购买商业支持才能在Java发行6个月后获得更新。与短期释放相比,长期释放有何意义?像JDK 9/10这样的短期发行版没有Oracle的商业支持吗?
安迪·杜弗雷斯

@AndyDufresne为什么您认为仅六个月后就必须支付抚养费?我的理解是时间表是待定。但是6个月似乎简直太短了……我怀疑我们能否期望5年的公共更新,就像Java 8一样,但是如果有2或3年的公共更新我不会感到惊讶。参考-每个人: oracle.com/technetwork/java/eol-135779.html
吉尔伯特·阿里纳斯·匕首'18

1
oracle链接提到“例如,如Oracle生命周期支持策略中所述,将为Oracle JDK 11的LTS版本(18.9 LTS)提供至少5年的支持。” 该政策有3个级别的支持,没有哪个级别是免费的。我也在这里查看Azul CTO的评论后提到了这一点-blog.takipi.com/java-11-will-include-more-than-just-features/…。此新发行策略的主要目标是不花时间维护旧发行版。如果支持是免费的,则模型将与迄今为止相同。
安迪·杜弗雷斯

38

对于Java 8,Oracle JDK与OpenJDK的主要区别在于:

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

  • OpenJDK是根据GPL v2许可发行的,其中Oracle JDK是根据Oracle Binary Code许可协议获得许可的。

  • 实际上,Oracle JDK的构建过程是从OpenJDK源代码构建的。因此,Oracle JDK和OpenJDK之间没有主要的技术差异。除基本代码外,Oracle JDK还包括Oracle的Java Plugin和Java WebStart的实现。它还包括第三方封闭源和开放源组件,分别是图形光栅化器和Rhino。OpenJDK Font Renderer和Oracle JDK Flight Recorder是Oracle JDK和OpenJDK之间明显的主要区别。

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

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


4
对于Android Studio,这不再成立:最新的OpenJDK副本与Android Studio 2.2及更高版本捆绑在一起,并且这是我们建议您在Android项目中使用的JDK版本。来源:developer.android.com/studio/intro/studio-config#jdk
MKesper,

“像Minecraft这样的软件都希望使用Oracle JDK。实际上,警告。” 实际上,在Ubuntu中,Mojang的官方.deb安装程序在安装启动器时会拉入OpenJDK。
50Moilleadóir

29

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
感谢您指出真正的差异:不运行代码是现实生活中的事情。您是从哪里开始的diff
马修(Matthieu)'18

19

根据oracle博客的说法,适用于Java 11和更高版本的Oracle JDK版本

从Java 11开始,Oracle将根据开源GNU通用公共许可证v2,带有类路径异常(GPLv2 + CPE)以及针对将Oracle JDK用作Oracle产品或服务的一部分的商业许可证,提供JDK版本,或不希望使用开源软件的人。使用开源许可证和商业许可证的这种组合取代了历史上的“ 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获得Oracle Java SE二进制文件作为商业产品或服务的一部分,那么可以继续通过My Oracle Support(MOS)和其他位置获得Oracle JDK版本。

功能相同且可互换...

从甲骨文获得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年9月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文件的形式提供,同时正在考虑使用其他分发格式。

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构建区分开。

2
我注意到您的大多数答案都带有签名。我已经将它们删除了。请阅读是否禁止标语和签名?stackoverflow.com/help/behavior(特别是“请勿使用签名,标语或问候语。”部分)
Mark Rotteveel

7
  1. Oracle将每三年发布一次版本,而OpenJDK将每六个月发布一次。
  2. Oracle对其版本提供长期支持。另一方面,OpenJDK仅在发布下一个版本之前才支持对发行版的更改。
  3. Oracle JDK根据Oracle二进制代码许可协议获得许可,而OpenJDK具有GNU通用公共许可证(GNU GPL)版本2,但有链接例外。
  4. Oracle产品具有Flight Recorder,Java Mission Control和应用程序类数据共享功能,而OpenJDK具有Font Renderer功能。此外,Oracle具有更多的Garbage Collection选项和更好的渲染器,
  5. Oracle JDK由Oracle公司完全开发,而OpenJDK由Oracle,OpenJDK和Java社区开发。但是,诸如Red Hat,Azul Systems,IBM,Apple Inc.,SAP AG等一流公司也积极参与其开发。

从Java 11转变为一大变化

甲骨文将通过开源和商业许可证的组合更改其历史“ 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的版本


更新:25-八月-2019



在此处输入图片说明

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



5

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

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

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

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



3

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

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

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


从JDK 13开始可能不再如此。根据Oracle的说法,Oracle JDK有一个新许可证:“新许可证允许某些使用(例如个人使用和开发使用)免费使用,但其他使用已获得许可以前的Oracle JDK许可证可能不再可用”。请参见oracle.com/downloads/licenses/javase-license1.html
AL Flanagan

只是想知道,Oracle jdk8u241的当前版本可免费用于生产?
尼拉夫·沙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.