1. 程式人生 > >Java官方(Oracle/Sun)釋出的JDK和OpenJDK的關係

Java官方(Oracle/Sun)釋出的JDK和OpenJDK的關係

最近一階段,通過AndroidStudio一直在看AndroidJava的原始碼。發現Android SDK下有Java原始碼,JDK1.8下也有Java原始碼,但是內容大同小異。
這裡寫圖片描述
看JDK原始碼的時候,還會提醒內容反編譯自二進位制檔案,如下:
這裡寫圖片描述
然後在網上找到了R大的解釋,來自R大的知乎回答

在Oracle參與過HotSpot VM的研發。這個我有發言權。Oracle JDK與OpenJDK裡的JVM都是HotSpot VM。從原始碼層面說,兩者基本上是同一個東西。從JDK7開始,Oracle JDK裡的HotSpot VM,在研發的時候其實就是用放在http://openjdk.java.net

上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。事實上我以前在Oracle做HotSpot VM的開發時,通常都不簽出私有部分的程式碼,而是直接用OpenJDK的部分來開發。只有到最後要提交程式碼到JPRT的時候我才會把私有的部分簽出來(不然有些私有測試跑不過)。=================================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早了點。=================================下面有評論提醒了我補充一點:Oracle JDK只發布二進位制安裝包,而OpenJDK只發布原始碼。
如果使用跟Oracle一樣的平臺(作業系統/編譯器/系統庫)來構建OpenJDK,那麼得到的二進位制的JVM就會跟Oracle JDK裡的基本上一樣(除了私有部分功能之外)。但是如果用相當不同的編譯器(例如說不同大版本的GCC)來構建,得到的二進位制JVM可能會有奇怪的bug⋯