天天看點

java基礎總結(二十)--Oracle/Sun JDK與OpenJDK的差別和聯系簡單介紹詳細介紹

來自:https://blog.csdn.net/wangjianno2/article/details/52015442與https://www.cnblogs.com/zengkefu/p/5633342.html

在《深入了解JAVA虛拟機》這本書中有一下約定

1:本書中提到的HotSpot、JRockit虛拟機、WebLogic伺服器等産品所有者是,仍然使用Sun和BEA公司的名稱,實際上,BEA和Sun分别于2008年和2009年被Oracle公司收購,現在已經不存在這兩個商标了。

2:JDK從1.5版本開始,在官方的正式文檔與宣傳資料中已經不再使用類似“JDK1.5”的名稱,隻有程式員内部使用的開發版本号才繼續沿用1.5,1.6,1.7的版本号,而且公開版本号則改為JDK5, JDK6, JDK7,為了行文一緻,本書所有場合統一采用開發版本号的命名方式。

下面是從其他部落格摘取的

簡單介紹

         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時,他同樣需要先從http://hg.openjdk.java.net簽出OpenJDK,然後從Oracle内部的代碼庫簽出私有的部分,放在OpenJDK代碼下的一個特定目錄裡,然後建構。

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

詳細介紹

首先要先明确之間,以及OpenJDK 6、OpenJDK 7、OpenJDK 7u和OpenJDK 8等項目之間是什麼關系,這有助于确定接下來編譯要使用的JDK版本和源碼分支。

從前面介紹的Java發展史中我們了解到OpenJDK是Sun在2006年末把Java開源而形成的項目,這裡的“開源”是通常意義上的源碼開放形式,即源碼是可被複用的,例如IcedTea、UltraViolet都是從OpenJDK源碼衍生出的發行版。但如果僅從“開源”字面意義(開放可閱讀的源碼)上看,其實Sun自JDK 1.5之後就開始以Java Research License(JRL)的形式公布過Java源碼,主要用于研究人員閱讀(JRL許可證的開放源碼至JDK 1.6 Update 23為止)。把這些JRL許可證形式的Sun/OracleJDK源碼和對應版本的OpenJDK源碼進行比較,發現除了檔案頭的版權注釋之外,其餘代碼基本上都是相同的,隻有字型渲染部分存在一點差異,Oracle JDK采用了商業實作,而OpenJDK使用的是開源的FreeType。當然,“相同”是建立在兩者共有的元件基礎上的,Oracle JDK中還會存在一些Open JDK沒有的、商用閉源的功能,例如從JRockit移植改造而來的Java Flight Recorder。預計以後JRockit的MissionControl移植到HotSpot之後,也會以Oracle JDK專有、閉源的形式提供。

Oracle的項目釋出經理Joe Darcy在OSCON 2011上對兩者關系的介紹也證明了OpenJDK 7和Oracle JDK 7在程式上是非常接近的,兩者共用了大量相同的代碼(如下圖,注意圖中提示了兩者共同代碼的占比要遠高于圖形上看到的比例),是以我們編譯的OpenJDK,基本上可以認為性能、功能和執行邏輯上都和官方的Oracle JDK是一緻的。

java基礎總結(二十)--Oracle/Sun JDK與OpenJDK的差別和聯系簡單介紹詳細介紹

Dalvik 與java虛拟機:

1.java虛拟機基于棧。 基于棧的機器必須使用指令來載入和操作棧上資料,所需指令更多更多 .

而dalvik虛拟機是基于寄存器的:java虛拟機運作的是java位元組碼。

(java類會被編譯成一個或多個位元組碼.class檔案,打包到.jar檔案中,java虛拟機從相應的.class檔案和.jar檔案中擷取相應的位元組碼)

2.Dalvik和Java之間的另外一大差別就是運作環境——Dalvik經過優化,允許在有限的記憶體中同時運作多個虛拟機的執行個體

OpenJDK :
           
[[email protected] ~]# java -version
java version "1.6.0_39"
OpenJDK Runtime Environment (IcedTea6 1.13.11) (rhel-1.13.11.0.el5_11-x86_64)
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)
           

oracle jdk:

java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
           
OpenJDK下載下傳:
http://openjdk.java.net/install/index.html
           
JDK 8:yum install java-1.8.0-openjdk
JDK 7:

yum install java-1.7.0-openjdk
JDK 6:yum install java-1.6.0-openjdk
           
java基礎總結(二十)--Oracle/Sun JDK與OpenJDK的差別和聯系簡單介紹詳細介紹

1. HotSpot曆史

    SUN的JDK版本從1.3.1開始運用HotSpot虛拟機, 2006年底開源,主要使用C++實作,JNI接口部分用C實作。

    HotSpot是較新的Java虛拟機,用來代替JIT(Just in Time),可以大大提高Java運作的性能。 

    Java原先是把源代碼編譯為位元組碼在虛拟機執行,這樣執行速度較慢。而HotSpot将常用的部分代碼編譯為本地(原生,native)代碼,這樣顯着提高了性能。 

    HotSpot JVM 參數可以分為規則參數(standard options)和非規則參數(non-standard options)。 

    規則參數相對穩定,在JDK未來的版本裡不會有太大的改動。 

    非規則參數則有因更新JDK而改動的可能。

    規則和非規則參數這裡不做介紹了,網上資料很多。

2.HotSpot基礎知識

    HotSpot包括一個解釋器和兩個編譯器(client 和 server,二選一的),解釋與編譯混合執行模式,預設啟動解釋執行。

    編譯器:java源代碼被編譯器編譯成class檔案(位元組碼),java位元組碼在運作時可以被動态編譯(JIT)成本地代碼(前提是解釋與編譯混合執行模式且虛拟機不是剛啟動時)。

    解釋器: 解釋器用來解釋class檔案(位元組碼),java是解釋語言(書上這麼說的)。

    server啟動慢,占用記憶體多,執行效率高,适用于伺服器端應用;

    client啟動快,占用記憶體小,執行效率沒有server快,預設情況下不進行動态編譯,适用于桌面應用程式。

    由-XX:+RewriteFrequentPairs參數控制  client模式預設關閉,server模式預設開啟

    在jre安裝目錄下的lib/i386/jvm.cfg 檔案下。

   java -version

   Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)

   mixed mode 解釋與編譯 混合的執行模式 預設使用這種模式

   java -Xint -version

   Java HotSpot(TM) Client VM (build 14.3-b01, interpreted mode, sharing)

   interpreted  純解釋模式 禁用JIT編譯

   java -Xcomp -version

   Java HotSpot(TM) Client VM (build 14.3-b01, compiled mode, sharing)

   compiled  純編譯模式(如果方法無法編譯,則回退到解釋模式執行無法編譯的方法)

3.動态編譯

      動态編譯(compile during run-time),英文稱Dynamic compilation;Just In Time也是這個意思。

      HotSpot對bytecode的編譯不是在程式運作前編譯的,而是在程式運作過程中編譯的。

      HotSpot裡運作着一個螢幕(Profile Monitor),用來監視程式的運作狀況。

      java位元組碼(class檔案)是以解釋的方式被加載到虛拟機中(預設啟動時解釋執行)。 程式運作過程中,那一部分運用頻率大,那些對程式的性能影響重要。對程式運作效率影響大的代碼,稱為熱點(hotspot),HotSpot會把這些熱點動态地編譯成機器碼(native code),同時對機器碼進行優化,進而提高運作效率。對那些較少運作的代碼,HotSpot就不會把他們編譯。

      HotSpot對位元組碼有三層處理:不編譯(位元組碼加載到虛拟機中時的狀态。也就是當虛拟機執行的時候再編譯),編譯(把位元組碼編譯成本地代碼。虛拟機執行的時候已經編譯好了,不要再編譯了),編譯并優化(不但把位元組碼編譯成本地代碼,而且還進行了優化)。

       至于那些程式那些不編譯,那些編譯,那些優化,則是由螢幕(Profile Monitor)決定。

4.為什麼不靜态編譯那?

    為什麼位元組碼在裝載到虛拟機之前就編譯成本地代碼那? 

    動态編譯器也在許多方面比靜态編譯器優越。靜态編譯器通常很難準确預知程式運作過程中究竟什麼部分最需要優化。

    函數調用都是很浪費系統時間的,因為有許多進棧出棧操作。是以有一種優化辦法,就是把原來的函數調用,通過編譯器的編譯,改成非函數調用,把函數代碼直接嵌到調用出,變成順序執行。

    面向對象的語言支援多态,靜态編譯無效确定程式調用哪個方法,因為多态是在程式運作中确定調用哪個方法。

jdk 1.9 等價JDK9 J2SE9 JAVA9

jdk 1.8 等價JDK8 J2SE8 JAVA8

jdk 1.7 等價JDK7 J2SE7 JAVA7

jdk 1.6 等價JDK6 J2SE6 JAVA6

jdk 1.5 等價JDK5 J2SE5 JAVA5

jdk 1.4 等價J2SE1.4

jdk 1.3 等價J2SE1.3

jdk 1.2 等價J2SE1.2

jdk 1.1

openjdk源碼下載下傳: 
Oracle JDK隻釋出二進制安裝包,而OpenJDK隻釋出源碼
           
擷取OpenJDK源碼有兩種方式:

第一種方式:

下載下傳OpenJDK7u的源代碼:

hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev
cd jdk7u-dev
chmod 755 get_source.sh
./get_source.sh


下載下傳OpenJDK8u的源代碼:

hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev
cd jdk8u-dev
./get_source.sh


注意:這是最直接的方式,從版本管理中看變更軌迹比看Release Note效果更好。但不足之處是速度太慢,雖然代碼總容量隻有300 MB左右,
但是檔案數量太多,在筆者的網絡下全部複制到本地需要數小時。


第二種方式,即直接下載下傳官方打包好的源碼包

讀者可以從Source Bundle Releases頁面(位址:http://jdk7.java.net/source.html)取得打包好的源碼,到本地直接解壓即可。
一般來說,源碼包大概一至兩個月左右會更新一次,雖然不夠及時,但比起從Mercurial複制代碼的确友善和快捷許多。
筆者下載下傳的是OpenJDK 7 Update 6 Build b21版源碼包,2012年8月28日釋出,大概99MB,解壓後約為339MB。

備注:推薦在linux平台或者mac平台上面編譯jdk