OracleJDK和OpenJDK有什麼區別?

借用知乎大神RednaxelaFX的文章分享下這個問題

Oracle JDK與OpenJDK裏的JVM都是HotSpot VM。從源碼層面說,兩者基本上是同一個東西。

從JDK7開始,Oracle JDK裏的HotSpot VM,在研發的時候其實就是用放在OpenJDK的Mercurial代碼庫。也就是說跟大家從外部能實時看到的OpenJDK用的是同一個代碼庫。

HotSpot VM只有非常非常少量的功能沒有在OpenJDK裏,那部分在Oracle內部的代碼庫裏。這些私有部分都不涉及JVM的核心功能。

所以當一個Oracle員工要構建OpenJDK時,他要做的事情跟外面的人一樣:從http://hg.openjdk.java.net簽出代碼,構建。

而當他要構建Oracle JDK時,他同樣需要先從http://hg.openjdk.java.net簽出OpenJDK,然後從Oracle內部的代碼庫簽出私有的部分,放在OpenJDK代碼下的一個特定目錄裏,然後構建。

這些HotSpot VM私有的部分主要是Java Flight Recorder的內部實現,以及還有沒有公開到OpenJDK的其它平臺的port,例如Oracle自己的ARM、PPC版HotSpot VM。

JDK6的代碼,由於歷史原因,Sun JDK6跟OpenJDK6的代碼並不同步。但是其中的HotSpot VM仍然是相對一致的。OpenJDK 6裏的HotSpot VM只缺了一個Oracle JDK裏纔有的優化,那就是-XX:+UseCompressedString。這個功能實現得不太好,沒帶進JDK7/OpenJDK7,所以這點差異沒有也罷。

另外,Sun JDK6跟OpenJDK6在切代碼的時候不一定是在同一天,所以同一個大版本號(例如HotSpot 20.0)裏面的內容可能會稍微有點不一樣。例子之一就是Oracle/Sun JDK6u25裏有完整的tiered compilation系統的實現,而OpenJDK6對應的HotSpot 20.0卻沒包含這個實現;同一時間的OpenJDK7分支裏的HotSpot VM又有這個功能,說明這個功能本身並不是啥私有功能,只是OpenJDK6切代碼的時間有可能比Oracle/Sun JDK6u25早了點。

OpenJDK原是SunMicrosystems公司爲Java平臺構建的Java開發環境(JDK)的開源版本,完全自由,開放源碼。Sun Microsystems公司在2006年的JavaOne大會上稱將對Java開放源代碼,於2009年4月15日正式發佈OpenJDK。甲骨文在2010 年收購SunMicrosystem之後接管了這個項目。

Oracle/Sun JDK裏面包含的JVM是HotSpotVM,HotSpot VM只有非常非常少量的功能沒有在OpenJDK裏,那部分在Oracle內部的代碼庫裏。這些私有部分都不涉及JVM的核心功能。所以說,Oracle/Sun JDK與OpenJDK其實使用的是同一個代碼庫。

值得注意的是,Oracle JDK只發布二進制安裝包,而OpenJDK只發布源碼。

來源:zhihu.com/question/19882320

END -

「技術分享」某種程度上,是讓作者和讀者,不那麼孤獨的東西。歡迎關注我的微信公衆號:「Kirito的技術分享」


本文分享自微信公衆號 - Kirito的技術分享(cnkirito)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章