Open JDK 和 Oracle JDK,哪个更优秀?

  • 2020 年 2 月 17 日
  • 笔记

作者 | petercao

urlify.cn/yAn6ru

前言

Open JDK 是 Sun 在 2006 年末把 Java 开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如 IcedTea、UltraViolet 都是从 Open JDK 源码衍生出的发行版。

Oracle JDK 采用了商业实现,而 Open JDK 使用的是开源的 FreeType。当然,“相同”是建立在两者共有的组件基础上的,Oracle JDK 中还会存在一些Open JDK 没有的、商用闭源的功能,例如从 JRockit 移植改造而来的 Java Flight Recorder。预计以后 JRockit 的 MissionControl 移植到 HotSpot 之后,也会以 Oracle JDK 专有、闭源的形式提供。

Oracle 的项目发布经理 Joe Darcy 在 OSCON 2011 上对两者关系的介绍也证实了 Open JDK 7 和 Oracle JDK 7 在程序上是非常接近的,两者共用了大量相同的代码(如下图,注意图中提示了两者共同代码的占比要远高于图形上看到的比例),所以我们编译的 Open JDK,基本上可以认为性能、功能和执行逻辑上都和官方的 Oracle JDK 是一致的。

在大多数 LINUX 发行版本里,内置或者通过软件源安装的 JDK,都是安装的Open JDK。

什么是 Open JDK?

历史上的原因是,OpenJDK是JDK的开放源码版本,以GPL协议的形式发布。(General Public License)

在 JDK 7 的时候,Open JDK 已经成为 JDK 7 的主干开发版,SUN JDK 7 是在 Open JDK 7 的基础上发布的,其大部分源码都相同,只有少部分源码被替换掉。

使用 JRL(Java Research License,Java 研究授权协议)发布。

至于 Open JDK 6 则更是有其复杂的一面,首先是 Open JDK 6 是 JDK 7 的一个分支,并且尽量去除 Java SE 7 的新特性,使其尽量的符合 Java 6 的标准。

JDK 和 Open JDK 的区别

1、授权协议的不同

Open JDK 采用 GPL V2 协议发布,而 JDK 则采用 JRL 协议发布。两个协议虽然都是开放源代码的,但是在使用上的不同在于 GPL V2 允许在商业上使用,而JRL只允许个人研究使用。

2、Open JDK 只包含最精简的 JDK

Open JDK 不包含其他的软件包,比如 Rhino Java DB JAXP……,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。

3、Open JDK 源代码不完整

这个很容易想到,在采用 GPL 协议的 Open JDK 中,SUN JDK 的一部分源代码因为产权的问题无法开放 Open JDK 使用,其中最主要的部分就是 JMX中的可选元件 SNMP 部分的代码。

因此这些不能开放的源代码将它作成 plug,以供 Open JDK 编译时使用,你也可以选择不要使用 plug。

而 Icedtea 则为这些不完整的部分开发了相同功能的源代码(Open JDK 6),促使 Open JDK 更加完整。

4、Open JDK 和 IcedTea 的关系

IcedTea 项目最初是由于 Open JDK 不完整(因产权 而造成的障碍)而创立的,社区需要一个完整的开源工具链及代码库。

IcedTea 长期以来一直是 Open JDK 的一套补丁,正如刚才我所说到的,它有一个基于“./configure”的不同的构建系统。

在 Open JDK 中,我们已经替换了产权代码(encumbered code),因此不再有障碍了。正因为我们的努力,IcedTea 项目已经减少了使用补丁的数量。

IcedTea 中看上去不错的一点是,它的 configure 脚本使得在多种不同的模式下构建 Open JDK 变得很容易,比如使用 Zero Assembler Port 在非 x86/sparc 芯片上来支持编译等等。

IcedTea 提供的一大块内容是 plugin/java-web-start 基础架构。

5、部分源代码用开源代码替换

由于产权的问题,很多是 SUN JDK 的源代码被替换成一些功能相同的开源代码,比如说字体栅格化引擎,使用 Free Type 代替。

6、不能使用 Java 商标

这个很容易理解,在安装 Open JDK 的机器上,输入“java -version”显示的是 Open JDK,但是如果是使用 Icedtea 补丁的 Open JDK,显示的是 java(未验证)。

参考

Google Guava官方教程(中文版)

Google Guava官方教程(中文版)

Guava: Google Core Libraries for Java

Guava src and api doc:

https://github.com/google/guava

https://google.github.io/guava/releases/snapshot-jre/api/docs/