1. 程式人生 > >OpenJDK和Sun/OracleJDK 區別 與聯絡

OpenJDK和Sun/OracleJDK 區別 與聯絡

首先要先明確之間,以及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是一致的。

 

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

 

 

 

 

 

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

摘自:http://www.cnblogs.com/zengkefu/p/5633342.html 侵刪。