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/