面试官 | Oracle JDK 和 OpenJDK 有什么区别?
作者 | petercao
來(lái)源?|?urlify.cn/yAn6ru
OpenJDK是Sun在2006年末把Java開(kāi)源而形成的項(xiàng)目,這里的“開(kāi)源”是通常意義上的源碼開(kāi)放形式,即源碼是可被復(fù)用的,例如IcedTea、UltraViolet都是從OpenJDK源碼衍生出的發(fā)行版。
Oracle JDK采用了商業(yè)實(shí)現(xiàn),而OpenJDK使用的是開(kāi)源的FreeType。當(dāng)然,“相同”是建立在兩者共有的組件基礎(chǔ)上的,Oracle JDK中還會(huì)存在一些Open JDK沒(méi)有的、商用閉源的功能,例如從JRockit移植改造而來(lái)的Java Flight Recorder。預(yù)計(jì)以后JRockit的MissionControl移植到HotSpot之后,也會(huì)以O(shè)racle JDK專有、閉源的形式提供。
Oracle的項(xiàng)目發(fā)布經(jīng)理Joe Darcy在OSCON 2011上對(duì)兩者關(guān)系的介紹也證實(shí)了OpenJDK 7和Oracle JDK 7在程序上是非常接近的,兩者共用了大量相同的代碼(如下圖,注意圖中提示了兩者共同代碼的占比要遠(yuǎn)高于圖形上看到的比例),所以我們編譯的OpenJDK,基本上可以認(rèn)為性能、功能和執(zhí)行邏輯上都和官方的Oracle JDK是一致的。
?
在大多數(shù)LINUX發(fā)行版本里,內(nèi)置或者通過(guò)軟件源安裝的JDK,都是安裝的OpenJDK。
# 什么是OpenJDK?
歷史上的原因是,OpenJDK是JDK的開(kāi)放源碼版本,以GPL協(xié)議的形式發(fā)布。 (General Public License)在JDK7的時(shí)候,OpenJDK已經(jīng)成為JDK7的主干開(kāi)發(fā)版,SUN JDK7是在OpenJDK7的 基礎(chǔ)上發(fā)布的,其大部分源碼都相同,只有少部分源碼被替換掉。 使用JRL(Java Research License,Java研究授權(quán)協(xié)議)發(fā)布。 至于OpenJDK6則更是有其復(fù)雜的一面,首先是OpenJDK6是JDK7的一個(gè)分支,并且盡量去除Java SE7的新特性,使其盡量的符合Java6的標(biāo)準(zhǔn)。# JDK和OpenJDK的區(qū)別
1.授權(quán)協(xié)議的不同
OpenJDK采用GPL V2協(xié)議發(fā)布,而JDK則采用JRL協(xié)議發(fā)布。 兩個(gè)協(xié)議雖然都是開(kāi)放源代碼的,但是在使用上的不同在于GPL V2允許在商業(yè)上使用, 而JRL只允許個(gè)人研究使用。2.OpenJDK只包含最精簡(jiǎn)的JDK
OpenJDK不包含其他的軟件包,比如Rhino Java DB JAXP……,并且可以分離的軟件包也都是盡量的分離,但是這大多數(shù)都是自由軟件,你可以自己下載加入。
3.OpenJDK源代碼不完整
這個(gè)很容易想到,在采用GPL協(xié)議的OpenJDK中,SUN JDK的一部分源代碼因?yàn)楫a(chǎn)權(quán) 的問(wèn)題無(wú)法開(kāi)放OpenJDK使用,其中最主要的部分就是JMX中的可選元件SNMP部分 的代碼。 因此這些不能開(kāi)放的源代碼將它作成plug,以供OpenJDK編譯時(shí)使用,你也可以選擇 不要使用plug。 而Icedtea則為這些不完整的部分開(kāi)發(fā)了相同功能的源代碼(OpenJDK6),促使 OpenJDK更加完整。4.OpenJDK和IcedTea的關(guān)系
IcedTea項(xiàng)目最初是由于OpenJDK不完整(因產(chǎn)權(quán) 而造成的障礙)而創(chuàng)立的,社區(qū)需要 一個(gè)完整的開(kāi)源工具鏈及代碼庫(kù)。 IcedTea長(zhǎng)期以來(lái)一直是OpenJDK的一套補(bǔ)丁,正如剛才我所說(shuō)到的,它有一個(gè) 基于 “./configure”的不同的構(gòu)建系統(tǒng)。 在OpenJDK中,我們已經(jīng)替換了產(chǎn)權(quán)代碼(encumbered code),因此不再有障礙了。 正因?yàn)槲覀兊呐?#xff0c;IcedTea項(xiàng)目已經(jīng)減少了使用補(bǔ)丁的數(shù)量。 IcedTea中看上去不錯(cuò)的一點(diǎn)是,它的 configure腳本使得在多種不同的模式下構(gòu)建 OpenJDK變得很容易,比如使用Zero Assembler Port在非x86/sparc芯片上來(lái)支持編譯 等等。 IcedTea提供的一大塊內(nèi)容是plugin/java-web-start基礎(chǔ)架構(gòu)。5.部分源代碼用開(kāi)源代碼替換
由于產(chǎn)權(quán)的問(wèn)題,很多是SUN JDK的源代碼被替換成一些功能相同的開(kāi)源代碼,比如說(shuō)字體柵格化引擎,使用Free Type代替。
6.不能使用Java商標(biāo)
這個(gè)很容易理解,在安裝OpenJDK的機(jī)器上,輸入“java -version”顯示的是OpenJDK,但是如果是使用Icedtea補(bǔ)丁的OpenJDK,顯示的是java。
(未驗(yàn)證)
# 參考
Google Guava官方教程(中文版)
http://ifeve.com/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/
【END】
近期熱文
面試珍藏:最常見(jiàn)的200多道Java面試題
被一個(gè)熟悉的面試題問(wèn)懵了:String...
面試官:如何實(shí)現(xiàn)冪等性校驗(yàn)?
年終盤點(diǎn) | 2019年Java面試題匯總篇(附答案)
關(guān)注下方二維碼,訂閱更多精彩內(nèi)容
朕已閱?
總結(jié)
以上是生活随笔為你收集整理的面试官 | Oracle JDK 和 OpenJDK 有什么区别?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 图片人脸检测——Dlib版(四)
- 下一篇: 写简历的十大误区