天天看點

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時,他同樣需要先從

簽出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内部員工的角度來看,當他要建構OracleJDK時,他同樣需要先從

值得注意的是,Oracle JDK隻釋出二進制安裝包,而OpenJDK隻釋出源碼。