注:此问题来自2014年。截至Java 11 OpenJDK和OracleJDK正在融合。
Oracle和OpenJDK之间有什么关键的区别吗?
例如,垃圾收集和其他JVM参数是否相同?
GC在两者之间的工作方式不同吗?
注:此问题来自2014年。截至Java 11 OpenJDK和OracleJDK正在融合。
Oracle和OpenJDK之间有什么关键的区别吗?
例如,垃圾收集和其他JVM参数是否相同?
GC在两者之间的工作方式不同吗?
当前回答
对于Java 8、Oracle JDK与OpenJDK,我的主要区别是:
OpenJDK是Java Standard Edition平台的开源实现,Oracle和开放Java社区对此做出了贡献。OpenJDK根据许可证GPL v2发布,其中Oracle JDK根据Oracle二进制代码许可协议获得许可。实际上,OracleJDK的构建过程是从OpenJDK源代码构建的。因此,OracleJDK和OpenJDK之间没有主要的技术差异。除了基本代码之外,OracleJDK还包括Oracle的Java插件和Java WebStart的实现。它还包括第三方开源和开源组件,如图形光栅化器和Rhino。OpenJDK字体渲染器和Oracle JDK飞行记录器是Oracle JDK和OpenJDK之间显著的主要区别。Rockit是Oracle的JVM,从JavaSE7、HotSpot和JRockit合并为一个JVM。所以现在我们只有合并的HotSpot JVM可用。有些情况下,人们声称他们在运行OpenJDK时遇到了问题,当切换到OracleJDK时,问题得到了解决。Twitter有自己的JDK。像Minecraft这样的软件希望使用Oracle JDK。事实上,他警告说。
有关差异的完整列表,请参阅源文章:Oracle JDK与OpenJDK和Java JDK开发过程
其他回答
对于Java 8,AMIS技术博客于2018年11月发布了一个针对各种JVM上托管的反应式(非阻塞)Spring Boot REST应用程序的有趣性能基准,该基准显示了以下差异:
OpenJDK的CPU使用率高于OracleJDK,OpenJDK的响应时间略低于OracleJDK,OpenJDK的内存使用率高于OracleJDK,
有关详细信息,请参阅源文章。
当然,YMMV,这只是基准之一。
对于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版本,那么商业许可证开始变得更有意义。