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 :

[root@localhost ~]# 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

 

 

 








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM